Java允许我编译以下代码,没有任何问题:
public class Test {
public static void main(String[] args){
try {
throw new RuntimeException();
} catch (Exception e) {
throw e;
}
}
}尽管java.lang.Exception是一个检查异常。这意味着我正在重新抛出未经检查的异常作为检查,然后就可以了。
很可能Java编译器能够发现在try块中没有抛出检查过的异常,但我无法在规范中找到备份该异常的部分。
我们能否依赖这种行为,并从哪个JDK版本开始呢?
Update:该类不使用Java 1.6.0_38编译,其消息如下:
Test.java:6: unreported exception java.lang.Exception; must be caught or declared to be thrown
throw e;
^
1 error发布于 2021-08-03 14:43:11
看起来这是Java7:用改进的类型检查捕获多个异常类型并重新抛出异常中增强的效果之一。参见节“用更具包容性的类型检查重新抛出异常”一节,
Java 7编译器可以确定语句抛出e所引发的异常一定来自try块,由try块引发的唯一异常可以是FirstException和SecondException。即使catch子句e的异常参数是类型异常,编译器也可以确定它是FirstException或SecondException的实例。
请注意,即使在Java 7和更高版本中,以下内容也不会编译:
public class Test {
public static void main(String[] args){
try {
throw new RuntimeException();
} catch (Exception e) {
Exception e1 = e;
throw e1;
}
}
}因为:
如果catch参数分配给catch块中的另一个值,则禁用此分析。
https://stackoverflow.com/questions/68635149
复制相似问题