たとえば、frameworks/JDKの多くのメソッドがスローする場合があります
Java.lang.SecurityException
ただし、これはメソッドシグネチャには示されていません(これは通常、チェックされた例外用に予約されているためです)。メソッドsigでRuntimeExceptionsを宣言することには多くの利点があると主張したいと思います(たとえば静的型チェックに似ています)。酔ってますか?
そのAPIのユーザーに誤解を招くため、署名で未チェックの例外を宣言しません。例外を明示的に処理する必要があるかどうかはもはや明らかではありません。
Javadocで宣言することは、必要だと思った場合に誰かが処理できるようにするが、必要であれば無視できることを知っているため、より良いアプローチです。これにより、チェック済みと未チェックの区別が明確になります。
「スローできる例外を含め、メソッドのAPIを文書化するのが非常に良い場合、ランタイム例外も指定してみませんか?」ランタイム例外は、プログラミングの問題の結果である問題を表します。そのため、APIクライアントコードは、それらから回復したり、何らかの方法で処理したりすることを合理的に期待できません。このような問題には、ゼロ除算などの算術例外が含まれます。 NULL参照を介してオブジェクトにアクセスしようとするなどのポインター例外。インデックス付けの例外(大きすぎるまたは小さすぎるインデックスを介して配列要素にアクセスしようとするなど)。
ランタイム例外はプログラム内のどこでも発生する可能性があり、一般的な例外では非常に多くなる可能性があります。 すべてのメソッド宣言にランタイム例外を追加すると、プログラムの明瞭さが低下します。
Collection#addのjavadocをご覧ください
多数の未チェックの例外が記載されています。
Throws:
UnsupportedOperationException - add is not supported by this collection.
ClassCastException - class of the specified element prevents it from being added to this collection.
NullPointerException - if the specified element is null and this collection does not support null elements.
IllegalArgumentException - some aspect of this element prevents it from being added to this collection.
忍耐がある場合は、この方法でメソッドによってスローされる可能性のある例外を徹底的に文書化することをお勧めします。ある意味では、チェック済み例外は多少自己文書化されるため、未チェックの例外に対してこれを行うことはさらに重要です(コンパイラーは呼び出しコードにそれらを確認させる)。
私の観点では、少なくともメソッドのjavadocでランタイム例外を宣言する方が良いです。署名で宣言することで、何かがうまくいかない場合に何が起こるかをさらに明確にします。これが、この情報の提供を提案する主な理由です。
参考までに、時間の経過とともに(現在2017年)、javadocのみでドキュメント化し、チェック例外を可能な限り回避するようになりました。
私の見解では、未確認の例外は、その性質に反するため、メソッドシグネチャで宣言しないでください。
ただし、メソッドがJavadocの@throwsにある可能性の高い状況を指摘するいくつかのチェックされていない例外をスローする可能性がある場合、何が間違っているのかを理解する際にメソッドを呼び出す他の人に役立ちます。ただし、これは、呼び出し元が処理できる可能性が高い例外(入力不良などによるNPEなど)に対してのみ有用です。
これは checked exceptions に関する議論と関係しています。ほとんどの人は、メソッドシグネチャで例外を宣言すべきではないことに同意するでしょう。
ランタイム例外の使用方法に関する discussion もあります。ランタイム例外はプログラミングエラーまたは致命的な状態を示すべきであるというポスターに同意します。そのため、署名でそれらを宣言するメリットはあまりありません。すべての方法は潜在的に1つを介して可能性があります。