为什么允许不引发异常的代码捕获已检查的异常?
在Java中,引发已检查异常(异常或其子类型 - IOException,InterruptedException等)的方法必须声明turps语句:
public abstract int read() throws IOException;
不声明语句的方法不能引发选中的异常。throws
public int read() { // does not compile
throw new IOException();
}
// Error: unreported exception java.io.IOException; must be caught or declared to be thrown
但是,在安全方法中捕获已检查的异常在java中仍然是合法的:
public void safeMethod() { System.out.println("I'm safe"); }
public void test() { // method guarantees not to throw checked exceptions
try {
safeMethod();
} catch (Exception e) { // catching checked exception java.lang.Exception
throw e; // so I can throw... a checked Exception?
}
}
其实不然。这有点滑稽:编译器知道e不是一个检查的异常,并允许重新抛出它。事情甚至有点荒谬,这段代码没有编译:
public void test() { // guarantees not to throw checked exceptions
try {
safeMethod();
} catch (Exception e) {
throw (Exception) e; // seriously?
}
}
// Error: unreported exception java.lang.Exception; must be caught or declared to be thrown
第一个片段是提问的动机。
编译器知道已检查的异常不能在安全方法中引发 - 所以也许它应该只允许捕获未经检查的异常?
回到主要问题 - 是否有任何理由以这种方式实现捕获已检查的异常?这只是设计中的缺陷,还是我错过了一些重要因素 - 也许是后向不兼容?在这种情况下,如果只允许被抓住,可能会出错吗?非常感谢您提供示例。RuntimeException