1

10行のコードがあるとします。どの行もNullPointerExceptionをスローする可能性があります。私はこれらの例外を気にしたくありません。行が例外をスローした場合、エグゼキュータは次の行にジャンプして先に進みます。Javaでこれを行うことはできますか?はいの場合、サンプルコードを教えてください。

更新:(より明確な質問のためにサンプルソースを追加してください)

first.setText(prize.first);
second.setText(prize.second);
third.setText(prize.third);
fourth.setText(prize.fourth);
fifth.setText(prize.fifth);
sixth.setText(prize.sixth);
seventh.setText(prize.seventh);
eighth.setText(prize.eighth);

上記の8行のコードがあるとします。私が欲しいのは、4行目(または5、6、...)が例外をスローした場合、他のすべてのコード行は正常に機能するということです。もちろん、try ... catchを使用して、例外を1行ずつキャッチできます。しかし、この方法は私のソースを非常に複雑にします。

4

5 に答える 5

7

不可能だよ。しばらく考えてみると、それもナンセンスだと気付くでしょう。このコードを例にとってみましょう。

String s = getSomeString(); // assigns null
int length = s.length; // throws NPE

if (length > 10) { // what would you do here?? length is un-initialized
    domeSomething();
}

編集

コードスニペットで質問を更新したので、 sを処理するための2つの一般的なアプローチがあります。null

1.本来あるべきではない場所でそれらを禁止します

コードスニペットで、EditTextsのリストを提供しました。これらのリストはnullである可能性があります。さて、私の意見ではActivity、Androidにいくつかのビューがあるはずの場合、何らかの理由でそれらのいずれかがあれば、プログラミングエラーになります。null一部のビューがないアクティビティは正しく機能しないため、NPEをスローしてアプリケーションを終了することは、完全に賢明な方法です。

NPEは、「ねえ、あなたは間違いを犯したので、それを修正しなければならない」と言っています。それまでは、予測できない状態のアプリが実行を継続することは安全ではありません。何が起こり、どのデータが破損する可能性があるかを誰も知らないためです。

2.意味のある場所でそれらを許可し、ヌルチェックを提供します

値が空になる可能性のある変数を持つことができる場所がいくつかあります。空の値を表現する方法はいくつかありnull、最も明白なものです。

その場合、NPEの可能性を単に無視することはできず、いくつかのnullチェックを実行する必要があります。しかし、繰り返しになりますが、NPEはあなたの敵ではありません。それはあなたがあなたが持つべきであるすべての可能な状況を説明するのを忘れていることをあなたに告げます。

もちろん、nullチェックを繰り返すと、コードが乱雑でノイズが多くなるため、nullチェックを一般化するメソッドをいくつか作成できます。私は賢明な例を思い付くことができなかったので、この方法は説明のためだけに取ってください。

public void clearEditTexts(EditText... editTexts) {
    for (EditText e : editTexts) {
        if (e != null) {
            e.setText("");
        }
    }
}

このメソッドは、渡されたすべてのEditTextの内容をクリアします。それらのいずれもnullにすることができますが、このメソッドはこれらのnullチェックを内部で実行するため、それぞれに対して手動で実行する必要はありません。


この質問は、nullの処理についても非常によく読んでい ます。!=nullステートメントの回避

于 2012-12-12T17:13:38.733 に答える
6

これは不可能です。変数がnullになる可能性がある場合は、それをチェックするか、nullにならないようにする必要があります。ごくまれに、オーバーライドされたメソッドが何もしないダミーオブジェクトの実装を作成すると便利な場合があるため、nullの代わりに有効なオブジェクトの代わりに使用できます。

于 2012-12-12T17:09:21.427 に答える
3

いいえ、できません。気にする必要があります。彼らは何が悪いのかを教えようとします。

于 2012-12-12T17:09:18.993 に答える
3

変数がnullであるという事実は注目に値するので、無視してはなりません。したがって、次のようなものが必要になります。

...
if(first != null && prize.first != null)
{
    first.setText(prize.first);
}
...

何らかの理由で絶対にNPEをスローする必要がある場合は、各行を独自のtry/catchで囲む必要があります。例外を自動的にキャッチして次の行に進める方法はありません。ただし、これを行うことはお勧めしません。

...
try
{
    first.setText(prize.first);
}
catch(NullPointerException e)
{
}
try
{
    second.setText(prize.second);
}
catch(NullPointerException e)
{
}
...
于 2012-12-12T17:18:28.183 に答える
1

NullPointerExceptionは実行時(チェックされていない)例外であり、Javaはチェックされていない例外をキャッチすることをお勧めしません。あなたはそれを防ぐための解決策を持っている必要があります。

于 2012-12-12T17:14:16.033 に答える