13

たとえば、チェックされていない例外をスローするメソッドがある場合:

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があると便利です。これについて他の人の意見を知りたいです。

4

3 に答える 3

6

API のユーザーがソース コードを表示できない場合、javadoc コメントは表示されません。そのため、throws句を宣言すると便利です。

また、一部のプログラマーにとっては、javadoc 内に何があるかを確認するよりも、メソッド シグネチャから例外をすばやく判断する方が簡単です。

throwsしかし、一般的には、チェックされていない例外を javadocs にのみリストする方が便利だと思います。なぜなら、節にチェックされた例外とチェックされていない例外の両方があると、状況が混乱する可能性があるからです。コンパイラを使用せずに、または各例外クラスのシグネチャを調べずに、例外の種類を特定することはできません。

ただし、チェックされていない例外は、状況が重大であり、実行時にプログラムで修正できなかったことを意味します。チェックされた例外の目的でチェックされていない例外を使用する場合 (状況は修正される可能性があると想定します) が、何らかの理由でコンパイラに強制的に例外をキャッチさせたくない場合は、例外をthrows節内にも配置することをお勧めします。

于 2014-07-03T12:49:47.507 に答える