0
@Test
public void testDoc()
{

   String a1 = "123"
   String b1 = null;

   String a2 = null
   String b2 = "456";

   boolean westId1 =
   (a1 == b1) || ((a1 != null)&& b1.equals(a1));
   println westId1

   boolean westId2 =
   (a2 == b2) || ((a2 != null)&& b2.equals(a2));
   println westId2


}

b1.equals(a1) で NPE を取得できないのはなぜですか? b1 が null の場合

4

2 に答える 2

3

これはグルーヴィーなので、あなたは素晴らしい世界に入り込んでいますNullObject

これを行う場合:

b = null
println b.getClass().name

それは印刷されます:

'org.codehaus.groovy.runtime.NullObject'

のインスタンスbも同様ですNullObject。そして、次のように定義されメソッドNullObjectがあります。equals

public boolean equals(Object to) {
    return to == null;
}

これが、NPE を取得しない理由です。このような論理ステートメントには短絡ルールが適用されますが、問題のステートメントは短絡されず、等号は Groovy によって処理されます。

やってみて:

println null.equals( 4 ) // prints 'false'
于 2013-04-26T07:50:26.520 に答える
1

あなたはその例外をスローするb1.equals(a1)ので、でNPEを取得します。b1nullnull.anyMethod()

a1.に遭遇すると、残りの条件を評価しない演算子のnullためNPE、.&&false

||ニーズ atrue&&ニーズ afalseを短絡させます。

Short-Circuit Evaluationと呼ばれるこの概念の詳細については、これを参照してください。

更新:-あなたの場合、次のようになります:-

boolean westId1 = (a1==null && b1==null) || (a1!=null && b1!=null && a1.equals(b1));

いつでも単純化できますが、理解を深めるために、要件に基づいて条件を付けました。

于 2013-04-26T03:09:39.620 に答える