null パラメータの場合、IllegalArgumentException または NullPointerException が発生しますか? [closed] 質問する

null パラメータの場合、IllegalArgumentException または NullPointerException が発生しますか? [closed] 質問する

プロパティの単純なセッターメソッドがありますが、nullこの特定のプロパティには適していません。私はいつもこの状況で悩んでいます。IllegalArgumentException、またはNullPointerException? Javadoc から見ると、どちらも適切なようです。何らかの標準が理解されているのでしょうか? それとも、これは単に好きなようにすればいいというもので、どちらも本当に正しいのでしょうか?

ベストアンサー1

次の理由により、(NPE)IllegalArgumentExceptionではなく (IAE)を使用する必要があります。NullPointerException

まず、NPE JavaDocはNPEが適切なケースを明示的にリストしています。これらはすべて、が不適切に使用された場合にランタイムによってnullスローされることに注意してください。対照的に、IAE JavaDocこれ以上明確なことはありません。「メソッドに不正または不適切な引数が渡されたことを示すためにスローされます。」はい、それはあなたです!

次に、スタック トレースに NPE が表示された場合、何を想定するでしょうか。おそらく、誰かが を逆参照したとnull考えられます。IAE が表示された場合、スタックの最上部にあるメソッドの呼び出し元が不正な値を渡したと考えられます。この場合も、後者の想定は正しく、前者の想定は誤解を招きます。

3 番目に、IAE は明らかにパラメータを検証するために設計されているため、それを例外のデフォルトの選択肢として想定する必要があります。では、なぜ代わりに NPE を選択するのでしょうか。異なる動作のためではありません。呼び出しコードが IAE とは別に NPE をキャッチし、結果として何か異なる動作を行うことを本当に期待していますか。より具体的なエラー メッセージを伝えようとしていますか。ただし、他のすべての不正なパラメータの場合と同様に、例外メッセージ テキストでそれを行うことができます。

4 番目に、他のすべての不正なパラメータ データは IAE になるので、一貫性を持たせないのはなぜでしょうか。不正な引数nullが特別なため、他のすべての種類の不正な引数とは別の例外が必要なのはなぜでしょうか。

最後に、他の回答で示された、Java API の一部がこのように NPE を使用しているという議論は受け入れます。ただし、Java API は例外タイプから命名規則まですべてに一貫性がないため、Java API (のお気に入りの部分) を盲目的にコピーするだけでは、これらの他の考慮事項に勝る十分な議論にはならないと思います。

おすすめ記事