@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为空?
答案 0 :(得分:3)
这很时髦,所以你进入了NullObject
如果你这样做:
b = null
println b.getClass().name
它将打印:
'org.codehaus.groovy.runtime.NullObject'
所以b
是NullObject
的一个实例。 NullObject
将an equals
method定义为:
public boolean equals(Object to) {
return to == null;
}
所以这就是你没有获得NPE的原因。短路规则确实适用于这样的逻辑语句,但问题中的语句不会被短路,等于由Groovy处理。
尝试一下:
println null.equals( 4 ) // prints 'false'
答案 1 :(得分:1)
您确实在b1.equals(a1)
获得了NPE,因为您的b1
是null
& null.anyMethod()
会抛出异常。
如果你的a1
也null
,那么你就不会得到NPE
,因为&&
运算符不能评估剩下的false
运算符条件,一旦遇到||
。
true
需要&&
而false
需要boolean westId1 = (a1==null && b1==null) || (a1!=null && b1!=null && a1.equals(b1));
短路!
请参阅此内容以了解有关此概念的更多信息,Short-Circuit Evaluation。
更新: - 对于您的情况,它将是这样的: -
{{1}}
你可以随时简化它,但我根据你的要求给出了条件,这样可以帮助你更好地理解!