たとえば、チェックされていない例外をスローするメソッドがある場合:
void doSomething(int i) {
if (i < 0) throw new IllegalArgumentException("Too small");
// ...
}
メソッドが例外をスローすることを明示的に宣言する利点はありますか、つまり
void doSomething(int i) throws IllegalArgumentException {
if (i < 0) throw new IllegalArgumentException("Too small");
// ...
}
javadoc で動作を説明するのとは対照的に (またはそれに加えて):
/**
* This method does something useful.
* @param i some input value
* @throws IllegalArgumentException if {@code i < 0}
*/
void doSomething(int i) {
if (i < 0) throw new IllegalArgumentException("Too small");
// ...
}
持っていることが役に立たないと私が主張する理由は次のthrows
とおりです。
throws
例外がスローされる状況に関する情報は提供せず、例外がスローされる可能性があることのみを示します。- これは未チェックの例外であるため、呼び出しコードで例外を処理する必要はありません。
doSomething
;の実装を見に行くと、それがスローされる可能性があることだけが本当にわかります。 - の本体は、
doSomething
他のタイプのチェックされていない例外をスローするコードを呼び出す可能性があります。「このメソッドがスローする」と主張することIllegalArgumentException
は、潜在的にストーリーの一部を伝えているだけのようです。 - メソッドが非最終的な場合、新しい実装が追加のチェックされていない例外をスローするように宣言されるようにオーバーライドできます。どの実装を呼び出しているかわかりません。
あると便利だと私が主張する理由は次のthrows
とおりです。
- メソッドを呼び出すときに発生することが合理的に予想される問題を報告しています。
throws
要するに不要だと思いますが、javadoc の記述 via@throws
があると便利です。これについて他の人の意見を知りたいです。