Java 规范要求,如果抛出异常,要么由 try/catch 语句处理,要么用“throws XYZException”声明函数。这有一个 RuntimeException 异常,如果它被抛出而没有被捕获,这是可以的。
这听起来像是一个见仁见智的问题,但我想得越多,它似乎就越违反直觉:
为什么我们有一个 RuntimeException 扩展异常?
当我第一次开始使用 Java 时,我认为必须以这种方式捕获所有异常,这是有道理的,因为所有异常都扩展了 Exception。出现 RuntimeException 异常异常:P 似乎违反了 OOP。既然 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) {
...
}
}
...没有错误。
我曾考虑过可能会扩展 Exception 的某种“CompileTimeException”,但是当您考虑足够多时,如果不像 RuntimeException 那样丑陋,它就无法工作。
基本上,为什么 Java 决定强制要求throws
除 RuntimeExceptions 之外的所有异常,而所有异常都可能是运行时异常,除非另有说明throws
?