NullパラメータのIllegalArgumentExceptionまたはNullPointerException?
1. 序章
アプリケーションを作成する際に行う決定の中には、例外をいつスローするか、およびどのタイプをスローするかについての多くがあります。
このクイックチュートリアルでは、誰かがnullパラメーターをメソッドの1つに渡したときにスローする例外の問題に取り組みます。IllegalArgumentExceptionまたはNullPointerException。
双方の議論を検討することにより、このトピックを探求します。
2. IllegalArgumentException
まず、IllegalArgumentExceptionをスローするための引数を見てみましょう。
nullが渡されたときにIllegalArgumentExceptionをスローする簡単なメソッドを作成しましょう。
public void processSomethingNotNull(Object myParameter) {
if (myParameter == null) {
throw new IllegalArgumentException("Parameter 'myParameter' cannot be null");
}
}
それでは、IllegalArgumentExceptionを支持する引数に移りましょう。
2.1. それはJavadocがそれを使用するために言う方法です
Javadoc for IllegalArgumentException を読むと、メソッドに不正または不適切な値が渡されたときに使用するためのものであると表示されます。 null オブジェクトは、メソッドがそれを予期していない場合、違法または不適切であると見なすことができます。これは、スローするのに適切な例外です。
2.2. 開発者の期待に一致します
次に、開発者として、アプリケーションにスタックトレースが表示されたときにどのように考えるかを考えてみましょう。 NullPointerException を受け取る非常に一般的なシナリオは、誤ってnullオブジェクトにアクセスしようとした場合です。 この場合、スタックの奥深くに行き、nullを参照しているものを確認します。
IllegalArgumentException を取得すると、メソッドに何か間違ったものを渡していると見なされる可能性があります。 この場合、スタックで呼び出している最下位のメソッドを探し、そこからデバッグを開始します。 この考え方を考えると、 IllegalArgumentException は、ミスが発生している場所に近いスタックに私たちを連れて行ってくれます。
2.3. その他の議論
NullPointerException の引数に移る前に、IllegalArgumentExceptionを支持するいくつかの小さなポイントを見てみましょう。 一部の開発者は、JDKのみがNullPointerExceptionをスローする必要があると感じています。 次のセクションで説明するように、Javadocはこの理論をサポートしていません。 もう1つの引数は、 IllegalArgumentException を使用する方が一貫性があるということです。これは、他の不正なパラメーター値に使用するためです。
3. NullPointerException
次に、NullPointerExceptionの引数について考えてみましょう。
NullPointerExceptionをスローする例を作成しましょう。
public void processSomethingElseNotNull(Object myParameter) {
if (myParameter == null) {
throw new NullPointerException("Parameter 'myParameter' cannot be null");
}
}
3.1. それはJavadocがそれを使用するために言う方法です
Javadoc for NullPointerException によると、 NullPointerExceptionは、オブジェクトが必要な場合にnullを使用しようとするために使用されることを意図しています。 メソッドパラメータがnullであることが意図されていない場合、これを必須のオブジェクトと合理的に見なし、NullPointerExceptionをスローすることができます。
3.2. JDKAPIと整合性があります
開発中に呼び出す一般的なJDKメソッドの多くについて考えてみましょう。 null を指定すると、それらの多くはNullPointerExceptionをスローします。 さらに、 Objects.requireNonNull()は、nullを渡すとNullPointerExceptionをスローします。 Objectsのドキュメントによると、パラメータの検証。
NullPointerException をスローするJDKメソッドに加えて、CollectionsAPIのメソッドからスローされる特定の例外タイプの他の例を見つけることができます。 ArrayList.addAll(index、Collection)は、インデックスがリストサイズの外にある場合はIndexOutOfBoundsExceptionをスローし、コレクションがnullの場合はNullPointerExceptionをスローします。 これらは、より一般的な IllegalArgumentException ではなく、2つの非常に特殊な例外タイプです。
IllegalArgumentException は、より具体的な例外タイプを使用できない場合に使用できるものと見なすことができます。
4. 結論
このチュートリアルで見たように、これは明確な答えがない質問です。 2つの例外のドキュメントは、単独で使用した場合、どちらも適切に聞こえるという点で重複しているようです。 開発者がデバッグを行う方法と、JDKメソッド自体に見られるパターンに基づいて、双方に説得力のある追加の議論もあります。
どちらの例外を選択した場合でも、アプリケーション全体で一貫性を保つ必要があります。 さらに、例外コンストラクターに意味のある情報を提供することで、例外をより便利にすることができます。 たとえば、例外メッセージでパラメータ名を指定すると、アプリケーションのデバッグが容易になります。
いつものように、サンプルコードはGitHubでから入手できます。