如果有一些代码显然不能抛出异常,而你编写了声明代码可以抛出该异常的周围代码,那么 Java 编译器似乎不一致。
考虑这些代码片段。
片段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{
}
它编译得很好。
因此,第一个代码片段的结果表明,编译器可以计算一个方法是否可以抛出 throws
列表中列出的异常。因此,编译器似乎故意不为第二个片段报告错误。但为什么?为什么编译器允许您在 throws
部分编写异常,即使编译器知道不能抛出这些异常?
最佳答案
编译器允许这样做,因为方法的 throws
子句是方法的签名的一部分,而不是其实现的一部分. implementation might change at some point, while keeping the signature the same 有可能.旧的实现可能会抛出已检查的异常,但新的可能不会。或者签名的设计者可能希望为实现者提供灵 active ,以便在并非总是需要时抛出已检查的异常。
关于java - 为什么Java编译器允许在throws部分列出方法不可能抛出的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22610768/