【发布时间】:2014-05-01 21:22:05
【问题描述】:
如果有一些代码显然不能抛出异常,而您编写的周围代码声明该代码可以抛出该异常,那么 Java 编译器似乎不一致。
考虑一下这些代码 sn-ps。
片段 1
从未抛出异常的catch。
public void g(){
try {
} catch (FileNotFoundException e) {//any checked exception
}
}
这是编译错误的消息
Unreachable catch block for FileNotFoundException. This exception is never thrown from the try statement body
片段2
throws 声明,表示从未抛出的异常。
public void g() throws FileNotFoundException{
}
它编译得很好。
因此,第一个代码sn -p的结果表明编译器可以计算出一个方法是否可以抛出throws列表中列出的异常。所以看来编译器故意没有报告第二个sn-p的错误。但为什么?为什么编译器允许您在throws 部分中编写异常,即使编译器知道这些异常不能被抛出?
【问题讨论】:
-
简单的答案是“因为规范是这样说的”。稍微推测一下,似乎在第一种情况下,您遇到了 Java 将无法访问的代码作为错误的决定:catch 块永远不会捕获任何东西。在第二种情况下,虽然您的方法实际上永远不会抛出该异常,但没有任何代码因此而无法访问。
-
@dlev 你不明白我的问题
-
可能是合约/接口和实现的情况。您定义了一个可能引发异常的方法 -> 调用者可能希望处理该异常如果它发生。该方法可以正常完成,它不必每次都抛出异常。在这种特殊情况下,您的实现将永远抛出异常,但方法(在任何未来的实现中)仍然可能。
-
P.S. “无法到达的 catch 块”似乎类似于警告,not 错误,因为代码仍在编译和运行......
-
@Admins - 它不是 stackoverflow.com/questions/22116175/… 的重复项
标签: java exception exception-handling