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


}

Why don't I get a NPE on b1.equals(a1) ? when b1 is 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

您确实在 处获得了 NPE b1.equals(a1),因为您的b1is null&null.anyMethod()会抛出该异常。

如果您a1也是null,那么您将不会得到NPE, 因为&&运算符一旦遇到 . 就不会评估其余条件false

||需要a和true需要&&afalse短路!

请参阅此内容以了解有关此概念的更多信息,即短路评估

更新:-对于您的情况,它将是这样的:-

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

您可以随时简化它,但我根据您的要求给出了条件,这样可以帮助您更好地理解!

于 2013-04-26T03:09:39.620 回答