我需要能够比较两个变量,这些变量有时可能为空。如果它们都为空,我仍然希望它被认为是平等的。有没有合适的方法呢?
我在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方法理解为引用相等。文档反复声明“非空”'对象,但为什么这对参考比较有影响?任何澄清将不胜感激。
答案 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
(显然是真的)。因此,要比较,您必须检查a
和b
是否为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;
对于这个
,?:运算符更简洁一些