Groovy 等于和NullPointerException

Groovy 等于和NullPointerException,groovy,Groovy,为什么我不能得到b1的NPE,等于(a1)?当b1为空时?您确实在b1处获得NPE。等于(a1),因为您的b1为null&null。anyMethod()将引发该异常 如果您的a1也为null,那么您就不会得到NPE,因为&&运算符在遇到false时不会计算其余条件 |需要一个true,&需要一个false来短路 请参阅此内容,以了解有关名为的概念的更多信息 更新:-对于您的情况,它将是这样的:- @Test public void testDoc() { String a1 = "12

为什么我不能得到b1的NPE,等于(a1)?当b1为空时?

您确实在
b1处获得NPE。等于(a1)
,因为您的
b1
null
&
null。anyMethod()
将引发该异常

如果您的
a1
也为
null
,那么您就不会得到
NPE
,因为
&&
运算符在遇到
false
时不会计算其余条件

|
需要一个
true
&
需要一个
false
来短路

请参阅此内容,以了解有关名为的概念的更多信息

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

@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
&
null。anyMethod()
将引发该异常

如果您的
a1
也为
null
,那么您就不会得到
NPE
,因为
&&
运算符在遇到
false
时不会计算其余条件

|
需要一个
true
&
需要一个
false
来短路

请参阅此内容,以了解有关名为的概念的更多信息

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

@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


}

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

这是groovy,因此您进入了
NullObject

如果您这样做:

boolean westId1 = (a1==null && b1==null) || (a1!=null && b1!=null && a1.equals(b1));
它将打印:

b = null
println b.getClass().name
所以
b
NullObject
的一个实例。而
NullObject
定义为:

'org.codehaus.groovy.runtime.NullObject'
这就是为什么你没有得到NPE。短路规则确实适用于这样的逻辑语句,但问题中的语句不会被短路,相等的语句只是由Groovy处理

试一试:

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

这是groovy,因此您进入了
NullObject

如果您这样做:

boolean westId1 = (a1==null && b1==null) || (a1!=null && b1!=null && a1.equals(b1));
它将打印:

b = null
println b.getClass().name
所以
b
NullObject
的一个实例。而
NullObject
定义为:

'org.codehaus.groovy.runtime.NullObject'
这就是为什么你没有得到NPE。短路规则确实适用于这样的逻辑语句,但问题中的语句不会被短路,相等的语句只是由Groovy处理

试一试:

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

请修复示例代码中的语法错误,例如
println westId1
。现在很难知道问题是在您的问题中还是在您真正使用的代码中。您应该在这个问题中添加groovy标记,然后请修复示例代码中的语法错误,例如
println westId1
。现在很难知道问题是在您的问题中,还是在您真正使用的代码中。您应该在这个问题中添加groovy标记,那么您如何将此条件检查更改为仅当字符串均为null或均为非null且相等时才计算为true?请检查我的更新!我已经根据你的话制定了条件,在你的句子中提到的确切位置添加了
和/或
@凤凰城:
a1==null?a2==null:a1.equals(a2)
但是a1==b1应该注意在nullPatashu时返回true,如果a1为null且a2不是,那么xpression返回什么?那么您如何更改此条件检查以仅当字符串都为null或都为非null且相等时才计算为true?请检查我的更新!我已经根据你的话制定了条件,在你的句子中提到的确切位置添加了
和/或
@凤凰城:
a1==null?a2==null:a1.equals(a2)
但是a1==b1应该注意在nullPatashu时返回true,如果a1为null,a2不是,那么xpression返回什么?