【发布时间】:2021-10-08 14:34:28
【问题描述】:
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 版本开始?
更新: 此类无法使用 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
【问题讨论】:
-
是的,但您在
catch块中不再有此信息。所以大家都知道我正在抛出一个Exception。 -
JLS 的第 14.18 节似乎相关。当表达式的类型是未经检查的异常类(§11.1.1)时,在编译时抛出很好......它没有直接说明它是指声明的类型还是一些推断的运行时类型,不过,……
-
您的代码在 Java 7 上编译和运行。
-
虽然它不能用 Java 6 编译。我已经更新了这个问题。
标签: java exception try-catch runtimeexception