在 Java 中,抛出已检查异常(Exception或其子类型 - IOException、InterruptedException 等)的方法必须声明throws语句:
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
如果只允许在这种情况下被捕获,可能会出现什么问题?非常感谢示例。