Equals和NullPointerException

时间:2013-04-26 03:05:15

标签: groovy

@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为空?

2 个答案:

答案 0 :(得分:3)

这很时髦,所以你进入了NullObject

的奇妙世界

如果你这样做:

b = null
println b.getClass().name

它将打印:

'org.codehaus.groovy.runtime.NullObject'

所以bNullObject的一个实例。 NullObjectan equals method定义为:

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

所以这就是你没有获得NPE的原因。短路规则确实适用于这样的逻辑语句,但问题中的语句不会被短路,等于由Groovy处理。

尝试一下:

println null.equals( 4 ) // prints 'false'

答案 1 :(得分:1)

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

如果你的a1null,那么你就不会得到NPE,因为&&运算符不能评估剩下的false运算符条件,一旦遇到||

true需要&&false需要boolean westId1 = (a1==null && b1==null) || (a1!=null && b1!=null && a1.equals(b1)); 短路!

请参阅此内容以了解有关此概念的更多信息,Short-Circuit Evaluation

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

{{1}}

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