web-dev-qa-db-ja.com

IllegalStateExceptionとIllegalArgumentExceptionをスローするのはいつですか?

まず、Javadocsから始めましょう。

IllegalStateException

不正または不適切なときにメソッドが呼び出されたことを通知します。つまり、Java環境またはJavaアプリケーションは、要求された操作に対して適切な状態ではありません。

IllegalArgumentException

メソッドに不正または不適切な引数が渡されたことを示すためにスローされます。

上記の問題は、それらが非常に白黒であることです。メソッドが呼び出し元から提供されたファイルを解析しているユースケースを考えてみましょう。ファイルは存在し、読み取り可能で、正しい形式です。ただし、ファイルの一部のコンテンツはビジネスルールに準拠していません。この場合にスローする適切な例外は何ですか-IllegalStateExceptionまたはIllegalArgumentException

Guava Preconditions やSpring Assert などのアサーションを提供するさまざまなライブラリを見ると、コンセンサスがないようです。 herehere のいくつかの良い議論がありますが、私が上記で述べた一般的なユースケースに決定的な答えを提供するものはありません。

免責事項:一部のコードを示していないことは理解していますが、これは適切なAPI設計を検討するための具体的で実用的な質問だと思います。人々が宿題のように見えないものに反対票を投じるのではなく、実際的な質問について喜んで話し合ったときに、スタックオーバーフローの古き良き時代に戻ったとしましょう。

7
Abhijit Sarkar

言い換えれば:

IllegalArgumentExceptionは、正の数を期待して負の数を指定するなど、タイプは受け入れられても値は受け入れられない場合にスローされます。

IllegalStateExceptionは、デッドスレッドからメソッドを呼び出すように、メソッドが呼び出されるべきではないときに呼び出されるとスローされます。

彼らがどのように混ざり合うことができるかわかりません。問題のあるファイルについての質問では、ParseExceptionまたはIOExceptionをスローする方が適切だと思います。

6

他の回答は、IllegalArgumentExceptionまたはIllegalStateExceptionをいつ使用するかを強調しています。しかし、私の見解(注:意見に基づく)では、これらの例外はユースケースでは使用しないでください。

要約すると、一部のファイルには有効な形式のデータが含まれ、アプリケーションに正常にロードされますが、一部の値はビジネスルールに準拠していません(注:いいえIO操作に失敗しました。形式は有効です= > IOExceptionParseExceptionも使用しないでください。これらは、失敗したIO操作または無効な形式)を示します。

なぜIllegalArgumentExceptionを使用すべきではないのですか?

この例外は、メソッドに不正または不適切な引数が渡されたことを示すためにスローされます。ファイルを検証するメソッドがあり、このファイル内のフィールドの値またはいくつかのフィールドの値の組み合わせが違法であるか、ビジネスルールに準拠していないと主張することができます。うん、あなたを指します。ただし、この状況でIllegalArgumentExceptionをスローした場合、他のライブラリ(または標準ライブラリまたは独自のコードから)によって引き起こされたIllegalArgumentExceptionsとIllegalArgumentExceptionsをビジネスルール違反を簡単に示すバリデーター(確かに、IAEをサブクラス化して、呼び出しメソッドでキャッチできます)。

なぜこれらの例外を分離したいのですか?使用例:ビジネスルール違反をユーザーに提示して、非準拠の入力を変更できるようにする必要があります。他のIAEまたは一般的なキャッチされていないランタイム例外は、たとえばサーバーで要求が失敗したことを示します。これらの場合、クライアントに異なる応答を送信する必要があります。


ビジネスルール違反を示すためにIllegalStateExceptionsを使用すべきではない理由についても、同様の方法で議論できます。それで、あなたのユースケースでは何を使うべきですか?これは、アプリケーションの規模に大きく依存します。 RuntimeExceptionの一部のカスタムサブクラスは、小規模なアプリケーションのジョブを実行できます。より大きなアプリケーションの場合、「javax.validation」のような検証ライブラリは試してみる価値があります。

3
sn42

IllegalStateExceptionはコーディングエラー用であり、入力エラー用ではありません。これは、クラスの不変条件に違反した場合、またはオブジェクトが誤った状態のときにメソッドが呼び出された場合に使用します。たとえば、閉じたリソースを使用したり、リソースを2回閉じたりします。

IllegalArgumentExceptionは、メソッドAPIごとに引数の値が無効な場合です。正の数のみが許可されている場合は-1を渡します。

この場合、どちらの例外も適切ではありません。入力ファイルにエラーがあるため、IOExceptionのサブクラスを作成します。

1
John Kugelman