这个Java代码合法吗?显然它在不同的编译器上得到了不同的结果。
foo
在未声明的情况下抛出Exception
。
如果try
块中的代码没有声明抛出任何异常,那么我们知道到达Exception
块的任何catch
都是RuntimeException
,所以实际上这是没关系
但这似乎需要深度静态代码分析,而对此方法的简单语法解读表明它是非法的。
您能引用我的语言规范的文章或部分吗?
public void foo() {// no throws clause
try {
// Lines of code
} catch (Exception e) {
throw e;
}
}
答案 0 :(得分:3)
请参阅§11.2 Compile-Time Checking of Exceptions:
对于每个可能结果的已检查异常,方法或构造函数的throws子句必须提及该异常的类或该异常类的一个超类(第11.2.3节)。
更多部分详细介绍了表达式和语句的异常分析。
如果您尝试使用代码:
try {
// Lines of code
} catch (Exception e) {
throw e;
}
它没有有效地抛出任何已检查的异常。它没有在Eclipse中给我任何编译器错误。
但是如果你尝试这样的话:
try {
new URL("https://www.stackoverflow.com");
} catch (Exception e) {
throw e;
}
它可以抛出一个已检查的异常,并且必须在throws
中提及它(或它的超类)。这给了我一个Eclipse中的“Unhandled exception type MalformedURLException”编译器错误。