14

私はそのようなコードを持っています:

if(object != null && object.field != null){
    object.field = "foo";
}

オブジェクトがヌルであると仮定します。

このコードは nullPointerException になりますか、それとも単に if ステートメントが実行されないのでしょうか?

もしそうなら、このコードをよりエレガントにリファクタリングするにはどうすればよいですか (もちろん可能であれば)?

4

10 に答える 10

20

&&短絡はしませんが、短絡し&ません。

しかし、このような単純な質問については、試してみることをお勧めします (マシンにアクセスできない場合は、ideone が役立ちます)。

&& - http://ideone.com/LvV6w & - http://ideone.com/X5PdU

最後に、確実に確認する場所はJLS §15.23です。最も読みやすいものではありませんが、関連するセクションは次 のように述べています。 && 演算子は & ( §15.22.2 ) に似ていますが、左側のオペランドの値が true の場合にのみ右側のオペランドを評価します。

于 2010-11-12T10:40:19.503 に答える
10

Javaには短絡評価があります。つまり、コードは問題ないはずです

于 2010-11-12T10:40:02.997 に答える
3

知る方法はひとつ!試して!どのように?さて、何かを出力するメソッドを作ってください:

public static boolean test(int i)
{
    System.out.println(i);
    return false;
}

...

if (test(1) && test(2) && test(3))
{
    // not reached
}

これは以下を出力します:

1

したがって、あなたの質問に対する答えは「いいえ」です。

于 2010-11-12T10:50:30.780 に答える
2

見つけるための最良の方法は、特に単一行の質問の場合に試してみることです。も速かったでしょう。

答えは、Java は「if」の本体を実行しないということです。

于 2010-11-12T10:40:33.370 に答える
2

これは何もスローしませんNullPointerException。条件は左から右に評価され、最初のfalse式が見つかった時点で残りの式は評価されません。

于 2010-11-12T10:41:21.513 に答える
2

たぶん、この他の質問があなたを助けます:

ブール演算子の違い: & vs && and | 対 ||

于 2010-11-12T13:31:59.177 に答える
1

&& と || 条件は、条件が真/偽であるかどうかを判断できる時点で停止します。あなたの場合、条件は直後に停止object != nullします。この場合、あなたのコードは問題ないと思います

于 2010-11-12T10:43:55.677 に答える
1

Javaには短絡評価があるので大丈夫でしょう。

コードは私には問題ないように見えますが、実際に確認する必要がありますobject.field != nullか? 変数を使用せずに設定するだけなので、テストを省略できると思います。

ちなみに、ほとんどのプログラマーは直接フィールドにアクセスするのobject.fieldではなく ( )、getter/setter を介してアクセスします ( object.setField(x);)。これ以上の文脈がなければ、これがあなたの場合に適切かどうかはわかりません.

于 2010-11-12T10:41:29.363 に答える
0

ここでは短絡が機能しますが、(私が何度も行ったように) 別のものを書くときに順序が間違っていることを保証するものではありません。これらの if ステートメントをネストし、ブール値チェックの順序を定義することをお勧めします。壊す:

if(object != null) 
{
    if(object.field != null)
    {
        object.field = "foo";
    }
}

これは、本質的に言っているのとまったく同じです。最初のブール値チェックが失敗した場合は、2 番目のチェックを行わないでください。object が null でない限り object.field はチェックされないため、nullPointerException も安全です。

ブール値で短絡を使用すると、複数の bool if ステートメントがある場合、どの部分が短絡したかを効率的にデバッグするのが難しくなるため、後で面倒になる可能性があります。

于 2010-11-12T10:45:32.997 に答える
0

それぞれの真偽値に関係なくすべてのブール式を評価したい場合は、 & と | を使用できます。&& と || の代わりに。ただし、これらはブール式でのみ使用してください。&& と ||、& と | とは異なります。ブール値の意味とはまったく異なる数値型の意味もあります。 http://ibiblio.org/java/course/week2/46.html

于 2010-11-12T10:42:06.383 に答える