java - 如何比较两个可能为null的对象?

时间:2015-06-16 19:04:59

标签: java nullpointerexception null

我需要能够比较两个变量,这些变量有时可能为空。如果它们都为空,我仍然希望它被认为是平等的。有没有合适的方法呢?

我在NetBeans中测试它,并查看.equals()的文档,并看到空引用表现得很奇怪。

这些是我的例子和结果:

Object a = null, b = null;
System.out.println(a == b);

返回true。

OR:

System.out.println(a.equals(b));

抛出NullPointerException。

在这种情况下==工作我想要的方式,或者我只是“幸运”#39;在这里得出结论' true'出于其他原因?

NullPointerException也让我感到困惑,因为我总是将Object的equals方法理解为引用相等。文档反复声明“非空”'对象,但为什么这对参考比较有影响?任何澄清将不胜感激。

3 个答案:

答案 0 :(得分:10)

==运算符测试两个变量是否具有相同的值。对于对象引用,这意味着变量必须引用同一个对象(或者两个变量都必须是null)。当然,equals()方法要求调用它的变量不是null。它的行为取决于被引用对象的类型(在实际对象上,而不是在声明的类型上)。默认行为(由Object定义)只是使用==

要获得所需的行为,您可以执行以下操作:

System.out.println(a == null ? b == null : a.equals(b));

注意:从Java 7开始,您可以使用:

System.out.println(java.util.Objects.equals(a, b));

在内部做同样的事情。

答案 1 :(得分:1)

您无法在null值上调用equals等方法。如果你想要saftly使用一个方法,你必须检查空值,如

if(a!=null)
    System.out.println(a.equals(b));
else
    System.out.println(a==b));

答案 2 :(得分:0)

a.equals(b)返回NullPointerException,因为它实际上是

null.equals(...)

和null没有.equals(或任何其他方法)。

b.equals(a)

相同的事情

a == b返回true,因为它是null == null(显然是真的)。因此,要比较,您必须检查ab是否为null或类似...

if (a != null) 
   return a.equals(b);  // This works because a is not null.  `a.equals(null)` is valid.  
else if (b != null) 
   return b.equals(a);  // a is null, but b is not
else 
   return a == b;

对于这个

,?:运算符更简洁一些