java - 为什么Java编译器允许在throws部分列出方法不可能抛出的异常

标签 java exception exception-handling

如果有一些代码显然不能抛出异常,而你编写了声明代码可以抛出该异常的周围代码,那么 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/

相关文章:

java - Apache Camel CXF

c++ - Protocol Buffers C++ 中的异常处理

.net - 使用稍微复杂的方法引用 WCF 服务时获取 "Recursive collection data contract"

c# - LINQ to SQL 和空值

java.lang.OutOfMemory错误: GC overhead limit exceeded android studio

java - 无法应用插件 'com.google.protobuf'

java - Java 的 java.lang.Runtime.exec() 和 PHP 的 exec() 有什么区别?

php - 以不同的名称重新抛出异常?什么是标准做法?

C++ 崩溃转储,堆栈在 Win32 异常时展开(当使用 catch(...) 时)- VS 2003

python - 提高网页抓取的速度/性能,但有很多异常(exception)情况