2012-01-26 6 views
8

私はしばしば、メソッドまたはコンストラクタの値としてnullが許可されていないjava SourceCodeを参照します。私はとにかくスローさにNullPointer NullPointerException上のメソッドを呼び出すしようとした場合ので、私は、全くその中で自分のために何の意味が見えない Javaでヌルを自己チェックするのに意味があります

public void someMethod(Object someObject){ 

    if(someObject == null) throw new NullPointerException() 

    someObject.aMethodCall() 

} 

のように、この典型的な実装が見えます。このメソッドがIllegalArgumentExceptionやその他のカスタムメイドの例外をスローすると、私は感知します。なぜこのチェックが理にかなっているのでしょうか(私は非常に頻繁に見ているように、その背後には意味があると思います)、またはそれが完全なナンセンスである理由

+0

正しい動作がnullポインタである場合(実際にはチェックに時間がかかるため、悪化します)、これは役に立ちません。 – Jim

+0

明示的なヌルチェックは、JIT処理後の暗示的なヌルチェックと同じくらい安いので、ここでのパフォーマンスについては心配しません。 –

+0

可能な重複:http://stackoverflow.com/questions/32280/passing-null-to-a-method私は、Adaで前提条件が使用されているのと同じように、パラメータの良さチェックのためのアサーションを好む。 – vulkanino

答えて

9

あなたが投稿したコードは、まったく意味がありません。それはcargo cult programmingの強力なケースのようです。おそらく、誰かが事前条件を一度チェックするために有用なテストを実装し、他の誰かがこのようにテストを適応させた可能性があります。

4

誰が回復するかは、この状況から。それが発信者の場合は、NPEを投げます。呼び出されたメソッドの場合は、nullをテストし、状況を解決するために必要な処理を行います。

編集: NPEを明示的にスローしないでください。あいまいな言葉遣いには申し訳ありません。

+0

しかし、OPが与えた例の場合、メソッド自体が例外から回復していないことは明らかです... – cdeszaq

+0

真実ですが、これは実際のコードではなくMWEとしてのみ取りました。 –

+0

チェックされていない例外をスローするのは悪いプログラミングです。 –

5

いいえ、それはそれほど意味がありませんが、NPEを投げても有用な情報が追加されないためです。そのことができます(nullであるかについての具体的なもの以外 -

if (someObject == null) throw new IllegalStateException("someObject was null"); 

しかし、それはどちらかの値の多くを追加しません:

あなたは(たとえば)はIllegalStateExceptionをスローすることによって、エラーがよりよい作ることができますより複雑なメソッドでは便利です)

+0

そして、可能な例外は 'throws'節で宣言し、文書化する必要があります。 –

5

もちろんnullをチェックしたいと思います。これはあなたのメソッドの前提条件であり、クライアントとの契約の一部です。あなたのメソッドがnull入力を受け入れることができない場合は、それを強制する必要があります。

例外の選択肢が改善される場合があります。私は通常IllegalArgumentExceptionと一緒に行く。

あなたを悩ませる方法が簡潔であれば、私は同意する必要があります。そこに新しい情報はありません。

+0

私は 'IllegalArgumentException'が良い選択だとは思わない。 「NPE」はより具体的です。また、Effective Javaの60項目を参照してください。 –

+0

私はそれを見てもらいますが、私が同意すればわかりません。 IAEのメッセージは、それを十分に明確にすることができます。また、他の条件にもフラグを立てることができます(例えば、空白もヌルもできない文字列)。あなたの解釈は非常に狭いですが、この問題を解決してください。 – duffymo

0

NPEを実際にトリガーする前に、メソッドが処理に時間がかかったり、元に戻すのが難しい場合は、このタイプのチェックが意味をなすと思います。与えられた例では、私はそれが実際に意味をなさないとは思わない。

一方、アサートまたはスローを使用すると、IllegalArgumentExceptionのようなより具体的な例外が理にかなっている可能性があります。

0

C#では、ArgumentNullExceptionが存在します。この例外は、コンストラクタ内の引数の名前をとります。だから、呼び出し元は、どの引数がillicity NULLであるかを知ることができます。 IllegalArgumentExceptionはほぼJavaに相当します。

2

あなたは以下の仮定のうちの1つの下で有用である可能性が記述状況:あなたは高価なされているか、実行前に、いくつかのグローバルな状態を変更行う、いくつかの操作を実行する必要がある場合)

1. someObject.aMethodCall()あなたが防ぐことができますロールバックコードと実行サイクルの浪費。

2.)データ構造内にsomeObjectが格納されている場合は、後でデータ構造からデータを取得する可能性があります。私は、Javaコレクションフレームワークのいくつかのクラスを思い出しています。これは、ストレージ構造にnullを許可するよりもむしろNPEを投げます。

+0

Javaコレクションの例:空の 'TreeSet'の古いバージョンでは' null'が追加されました.2番目の要素が追加されたときにNPEを投げただけです。現在のバージョンの 'TreeSet.add'は明示的に' null'をチェックします。 –

6

このようなものが意味をなさないコーナーケースがあります。 someObjectを使用しない場合、関数の開始時にエラーケースを直ちに短絡すると便利です。

public void someMethod(Object someObject){ 

    if(someObject == null) throw new NullPointerException(); 

    expensiveOperationNotUsingSomeObject(); 

    someObject.aMethodCall(); 
} 
+1

+1チェックと明示的なスロー*が役立ちます。早く失敗すると思う、早く失敗する。 – Qwerky

2

それが彼らの側のプログラミングエラーと私のコードのバグを区別するプログラマにとって、それははるかに困難になりますので、個人的に私は、パブリックAPIメソッドの一部として、NullPointerExceptionが投げたことがなかった理由があります(つまり、私は意図的にNPEをスローすることを許可したのですか?)。

異なる例外をスローすると、意図がはっきりとわかりやすくなり、プログラマは何が間違っているのかを簡単に見つけるのに役立ちます。だから私はIllegalArgumentExceptionと行くだろう。

これは内部的な方法ですか?アサーションを使うか、クラッシュさせてしまいます。明示的にNPEを投げる意味がありません。

関連する問題