为什么Java编译器允许通过throws
添加例外,即使它们不可能被抛出?
示例:
private static void foo() throws java.io.FileNotFoundException {
System.out.println("no possible FileNotFoundException here");
}
上面的代码编译得很好,但是FileNotFoundException
无法抛出。
答案 0 :(得分:1)
我建议维护:因为您可能希望稍后更改该方法以添加可能抛出FileNotFoundException
的操作,并且您希望强制此方法的所有调用者都知道如果将该方法更改为将来抛出FileNotFoundException
该怎么办。
该问题的另一个表现是子类可能会覆盖此方法并抛出异常,而这不能仅通过编译超类来确定。
答案 1 :(得分:0)
因为编译器不够聪明,无法找出每个异常? Java无法知道所有算法的可能结果,这听起来很合乎逻辑。就像编程语言永远不会证明是数学异常一样,它只能执行数学。
这意味着一个明显的数学“无限循环”对编程语言并不总是显而易见的。我认为,出于这样的推理,编译器并不打算查看将要执行的内容。
如果编译器必须预先检查编码器写的所有异常,它可能花费“几天”检查代码。总而言之,让程序员负责异常似乎更好。无论哪种方式,都没有伤害。
答案 2 :(得分:0)
仅在try { }
块中由编译器验证已检查的异常,但未验证方法体。有多种原因,这种检查的复杂性是一个,子类可以覆盖该方法并决定抛出异常的事实是第二个。
答案 3 :(得分:0)
在Netbeans 7.3.1中,这将显示为“未报告的例外”,它会警告您必须捕获或声明它。所以这将是一个错误。这取决于你的工具。