2012-01-23 12 views
10

私はこのmainyにJavaについて尋ねていますが、私はそれが言語のすべてのホストに適用されると思います。nullポインタの例外をキャッチ

if(myVariable==null){ 
     doSomethingAboutIt(); 
} 
else carryOn(myVariable); 

try{ 
    carryOn(MyVariable); 
}catch(NullPointerException e){ 
     doSOmethingAboutIt();} 

は、これらの両方のコードブロックは、本質的に同じで、考えてみましょうか?第二のアプローチを選択する理由はありますか?もちろん、myVariableは決してnullではありませんでしたが、それをチェックする最も良い方法は、単純なif文を実行することです。

+6

'NullPointerException'はプログラマーエラーを考慮する必要があります。それらをキャッチしないでください。彼らは決して投げられないようにしてください。 –

答えて

7

私の立場から、私は意思の等価これらの2つのコード・ブロックを検討することを躊躇してい。確かに、彼らは同じエラー処理を行いますが、それは何よりも開発者の決定です。

私には、ifテストになります。値が使用できるかどうかを確認し、できない場合は問題を回避しています。 try...catchブロックはとなり、値は有効です。となります。そうでない場合は、異常な動作を回避するために処理されます。

例外は、異常なプログラム中断コード(ゼロ除算など)が発生した場合に、最初に考慮する必要があります。

2

carryOn内の何かがヌルインスタンスのメソッド呼び出しまたはプロパティ呼び出しを参照していない限り、carryOn(MyVariable);はNPEを投げません。

例外の生成を生成するスタックトレースを必要とする例外をキャッチするなど、より多くの計算コストが最初にそれをチェックするよりも

私はそれは同様に「クリーンな」コードになりますと主張していると思います。

も参照してください: - Java try/catch performance, is it recommended to keep what is inside the try clause to a minimum? - Try Catch Performance Java

2

あなただけの例外的な出来事のための例外を使用しています。 2番目のコードではなく、最初のコードブロックを実行します。

0

最初のアプローチが発生し、いくつかのパフォーマンスの低下があるため、例外をキャッチするよりも優れています。私の意見では、Null Object patternを適用するのが最良の方法です。 Guavaライブラリは、独自のクラスを作成する代わりに、Optionalクラスを提供しています。

3

いいえ、これらのコードブロックは、全く同じではありません。

最初のコードブロックでは、myVariablenullであるかどうかをチェックしていて、1つの時点でしか実行していません。その後、myVariablenullになり、最終的にNullPointerExceptionをスローすることがあります。この場合、2番目のコードスニペットは例外をキャッチしますが、最初のコードスニペットは例外をキャッチします。

さらに、2番目のコードスニペットは、carryOn(myVariable)呼び出しの結果としてコールスタックのどこからでもスローされる可能性があるNullPointerExceptionsをキャッチします。これはひどいです。特定の変数が完全に別のものである場合はnullであるという前提の下で動作する例外を飲み込んでいます。

最初のコードスニペットを使用してください。

+0

1つの別れの考え。あなたがランタイム例外( 'NullPointerException'のような)を捕まえているなら、おそらく何か間違っているでしょう。そのような例外がどこから来るのかをプログラムで判断することは非常に難しいため、正しく処理することは非常に困難です。 – cheeken