<分区>
Java 规范要求,如果抛出异常,要么由 try/catch 语句处理,要么用“throws XYZException”声明该函数。这有一个 RuntimeException 异常,如果抛出它而没有被捕获,那是可以的。
这听起来像是一个见仁见智的问题,但我想得越多,就越觉得它确实违反直觉:
为什么我们有一个 RuntimeException 扩展异常?
当我第一次开始使用 Java 时,我认为所有异常都必须以这种方式捕获,这是有道理的,因为所有异常都扩展了 Exception。有一个 RuntimeException 异常似乎违反了 OOP :P。由于 RuntimeException 使 throws 有点多余,为什么 Java 不首先在运行时允许所有异常,仅在您想要强制调用者处理该类型的异常时才添加 throws ?
例子:
void noThrows() {
throw new Exception();
}
...没有错误。
void hasThrows() throws AnyBaseOfXYZException {
throw new XYZException();
}
...没有错误。
void testFunction() {
hasThrows();
}
...失败,因为“hasThrows”抛出 AnyBaseOfXYZException,并且未处理
void testFunction() {
try {
hasThrows();
} catch (AnyBaseOfXYZException e) {
...
}
}
...没有错误。
我曾想过可能是某种扩展异常的“CompileTimeException”,但是当你对它进行足够的思考时,它就无法正常工作而不像 RuntimeException 一样丑陋。
基本上,为什么 Java 决定强制所有异常都需要 throws
除了 RuntimeExceptions,当所有异常都可以是运行时异常时,除非用 throws
另有说明?