Java 仕様では、例外がスローされた場合、それを try/catch ステートメントで処理するか、関数を "throws XYZException" で宣言する必要があります。これには RuntimeException の例外があり、キャッチされずにスローされても問題ありません。
これは意見の問題のように聞こえるかもしれませんが、考えれば考えるほど直感に反するように思えます。
例外を拡張する RuntimeException があるのはなぜですか?
私が最初に Java を始めたとき、すべての例外をそのようにキャッチする必要があると考えていました。すべての例外が Exception を拡張するため、それは理にかなっています。RuntimeException 例外例外 :P を持つことは、OOP の違反のようです。RuntimeException はスローをやや冗長にするので、なぜ Java はそもそも実行時にすべての例外を許可せず、呼び出し元にそのタイプの例外を強制的に処理させたい場合にのみスローを追加したのでしょうか?
例:
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
ですか?