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

java-如何比较两个可能为空的对象?,java,nullpointerexception,null,Java,Nullpointerexception,Null,我需要能够比较两个变量,这两个变量有时可能是空的。如果它们都为空,我仍然希望它被认为是相等的。有什么合适的方法可以做到这一点吗 我在NetBeans中进行了测试,并查看了.equals()的文档,发现null引用的行为异常 以下是我的示例和结果: Object a = null, b = null; System.out.println(a == b); 返回true 或: 抛出NullPointerException 在这种情况下==是按照我希望的方式工作,还是我只是在这里“走运”,然后出于

我需要能够比较两个变量,这两个变量有时可能是空的。如果它们都为空,我仍然希望它被认为是相等的。有什么合适的方法可以做到这一点吗

我在NetBeans中进行了测试,并查看了.equals()的文档,发现null引用的行为异常

以下是我的示例和结果:

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

或:

抛出NullPointerException

在这种情况下==是按照我希望的方式工作,还是我只是在这里“走运”,然后出于其他原因得出了“正确”的结论


NullPointerException也让我感到困惑,因为我总是将对象的equals方法理解为引用等式。文档反复声明“non-null”对象,但为什么这对于引用比较很重要呢?任何澄清都将不胜感激。

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

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

System.out.println(a == null ? b == null : a.equals(b));
注意:从Java 7开始,您可以使用:

System.out.println(java.util.Objects.equals(a, b));
它在内部执行相同的操作。

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

null.equals(…)

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

b相同。等于(a)

a==b
返回true,因为它是
null==null
(显然是true)。因此,要进行比较,您必须检查
a
b
是否为空或类似的内容

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;

对于这一点?:运算符要简洁一些

您不能调用类似等于等于null值的方法。如果要安全地使用方法,必须检查空值,如

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

对象。等于(a,b);对象不是
null
。您需要开始区分变量、引用和对象。@OP:您收到的答案将帮助您了解哪里出了问题。但是,在您理解了所有这些之后,您将需要注意Hubert建议的内容,这正是您所追求的。null不是对象或实例。它没有类,不能对其调用方法,也不能将其用于任何事情(实际处理null的事情除外)。从
=
的意义上讲,null始终等于null<空值上的code>equals
没有意义,因为这意味着这两个实例在函数中是相同的sense@njzk2这让我想起了《圣经》中关于爱的一段话我认为您不需要测试
b!=空
。此时,如果
b==null
,则只需返回
true
。如果参数为
null
(并且
a
在该分支中必须为
null
),则
equals()
的任何合理实现都不会返回
true
。如果是这样,那么它必须为所有参数返回
true
,因为
Object#equals
的契约是它必须实现一个等价关系。是的,同意。在我的示例中,为了完整性,我编写了额外的if语句。。。即使是无关的
if(a!=null)
    System.out.println(a.equals(b));
else
    System.out.println(a==b));