java – 为什么在尝试编写catch时应该有异常抛出的可能性?
我正在玩一些异常程序,并遇到了一些我以前从未遇到过的惊喜.
import java.io.*; class ExceptionTest { public static void main(String[] args) { try { System.out.println("hello"); } catch(IOException ioe) { System.err.println("ioexception was thrown!!"); } } } 这会引发编译器错误: ExceptionTest.java:10: exception java.io.IOException is never thrown in body of corresponding try statement catch(IOException ioe) ^ 1 error 我的问题是为什么会这样? 为什么编译器担心它肯定永远不会达到的代码片段.它可能只是一个警告,而不是一个完整的错误.毕竟我们可能希望保留catch块作为我们可能进行的一些未来更改的备份,或者程序员在一些编辑后忘记删除它. 我知道我知道它可以避免不必要的击键等等.但它不应该麻烦编译器引起错误.还是有其他原因吗? 代码中的IOException catch块也会产生编译器错误,但Exception catch块不会……为什么会这样? 解决方法
因为Java设计者认为系统应该以这种方式提供帮助.这与以下情况相同:
public class EarlyReturn { public void foo() { return; System.out.println("Hi"); } } …这也导致编译时错误.永远不会运行的代码是一件坏事,编译器通过让我们知道它永远不会运行来帮助我们,设计师认为它应该是一个错误而不是一个警告. 如果你愿意的话,你可以改变你的代码来捕获Exception而不是IOException,但是虽然这会让编译器让你这么做,但你仍然会有永远不会运行的代码(这也是一件坏事).
IOException是一个经过检查的异常,只有以这种方式检查已检查的异常(这就是为什么要调用它们).有检查的异常,未经检查的异常(RuntimeException及其子类)和错误(错误及其子类).从技术上讲,已检查的异常是所有不是未经检查的异常或错误的异常(Section 11.1.1 of the JLS),但是 – 这是一个黑暗的角落 – 并未检查所有已检查的异常.具体来说,检查已检查的异常,除非它们是Exception或它的超类.从Section 11.2.3 of the JLS开始:
第11节的全部内容可能值得一读.正如你可以猜到的那样,这是Java的一部分,在早期发展得相当多,导致这个有些复杂的定义被检查的内容. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |