Lui*_*ndo 5 java exception rethrow
在oracle官方网站上写:( http://docs.oracle.com/javase/7/docs/technotes/guides/language/catch-multiple.html#rethrow )
具体来说,在 Java SE 7 及更高版本中,当您在 catch 子句中声明一个或多个异常类型,并重新抛出此 catch 块处理的异常时,编译器会验证重新抛出的异常类型是否满足以下条件:
try 块能够抛出它。
没有其他前面的 catch 块可以处理它。
它是 catch 子句的异常参数之一的子类型或超类型。
请集中注意第三点(它是 catch 子句的异常参数之一的子类型或超类型。)
这到底意味着什么?你能给我举一些例子吗?我无法清楚地理解它。
子类型部分非常简单 - 因为所有子类型也是它们的父类型,所以允许捕获并重新抛出任何子类型是非常合法的。我相信从第一天起就是这种情况(或者至少比我记忆中的更久远)。
至于超类型,这是 Java 7 中添加的增强功能。例如:
public class Demo {
static class Exception1 extends Exception{}
public static void main(String[] args) throws Exception1 {
try {
throw new Exception1();
}
catch(Exception ex) {
throw ex;
}
}
}
Run Code Online (Sandbox Code Playgroud)
您最初可能希望该方法无法编译,因为该main()方法仅声明它抛出 类型Exception1,但 catch 参数指定Exception。显然并非所有Exception对象都是Exception1。
但是,该catch参数是 的超类型(满足上面摘录的超类型要求),并且抛出的异常的类型与方法上的语句Exception1中声明的类型相同。throws因此,编译器可以验证在此上下文中重新抛出此异常是否有效,并且编译成功。
| 归档时间: |
|
| 查看次数: |
262 次 |
| 最近记录: |