如果有一些代码显然无法抛出异常,那么Java编译器似乎不一致,并且您编写了声明代码可以抛出该异常的周围代码.
请考虑这些代码段.
一个catch永远不会被抛出的异常.
public void g(){
try {
} catch (FileNotFoundException e) {//any checked exception
}
}
Run Code Online (Sandbox Code Playgroud)
消息是编译错误
Unreachable catch block for FileNotFoundException. This exception is never thrown from the try statement body
Run Code Online (Sandbox Code Playgroud)
一个throws声明,指示从不抛出的异常.
public void g() throws FileNotFoundException{
}
Run Code Online (Sandbox Code Playgroud)
它汇编很好.
因此,第一个代码段的结果显示编译器可以计算方法是否可以抛出throws列表中列出的异常.因此,似乎编译器故意不报告第二个片段的错误.但为什么?为什么编译器允许您在throws部分中编写异常,即使编译器知道这些异常不能被抛出?