在Oracle官方网站上写:(http://docs.oracle.com/javase/7/docs/technotes/guides/language/catch-multiple.html#rethrow)
详细地,在Java SE 7和更高版本中,当您在catch子句中声明一个或多个异常类型并重新抛出此catch块处理的异常时,编译器将验证重新抛出的异常的类型是否满足以下条件:
try块可以抛出它。
前面没有其他捕获块可以处理它。
它是catch子句的异常参数之一的子类型或超类型。
请注意第三点(它是catch子句的异常参数之一的子类型或超类型。)
那真的意味着什么?你能给我看看例子吗?我不太清楚。
答案 0 :(得分:2)
子类型部分非常简单-由于所有都是也是其父类型,因此允许捕获和重新抛出任何子类型都是不合法的。我相信从第一天开始就是这种情况(或者至少比我记得的更远了。)
对于超类型,这是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;
}
}
}
您最初可能会希望它不会被编译,因为main()
方法仅声明它抛出了Exception1
类型,而catch参数却指定了Exception
。显然,并非所有Exception
对象都是Exception1
。
但是,catch
参数是Exception1
的超类型(满足上述对专家的超类型要求),并且抛出的异常的类型与{{ 1}}方法的声明。因此,编译器可以验证重新抛出此异常在此上下文中是否有效,并且编译成功。