gst*_*low 8 java exception-handling exception
如果有一些代码显然无法抛出异常,那么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部分中编写异常,即使编译器知道这些异常不能被抛出?
Rae*_*ald 10
编译器允许这样做,因为throws方法的子句是方法签名的一部分,而不是其实现的一部分.这是可能的实现可能在某个时刻发生变化,同时保持签名相同.旧的实现可能抛出了已检查的异常,但新的异常可能没有.或者签名的设计者可能希望赋予实现者在不总是必要时抛出已检查异常的灵活性.
| 归档时间: |
|
| 查看次数: |
491 次 |
| 最近记录: |