比较没有NPE的两个空对象的值

时间:2017-07-20 05:34:15

标签: java nullpointerexception java-8

这是一个非常基本的问题,但为什么以下代码返回空指针异常?

String a = null;
String b = null;

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

根据这里的文件:

http://docs.oracle.com/javase/7/docs/api/java/util/Objects.html#equals(java.lang.Object,%20java.lang.Object)

.equals()函数在比较值之前首先检查null。它不应该返回true,因为它们都是null吗?

5 个答案:

答案 0 :(得分:5)

您链接的方法包含两个对象,并且是静态方法。您需要像Objects.equals(a, b)一样调用它。相反,你在一个抛出NPE的空对象上调用.equals()

答案 1 :(得分:3)

  

不应该返回true,因为它们都是空的吗?

NOP。由于 空引用的对象,因此在该对象上调用 ANY 实例方法将抛出NPE

所以你能做什么:

如果您还在使用java 6

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

从java 7开始

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

答案 2 :(得分:0)

我通常会写下面的方法,

private boolean equalsWithNull(String first, String second){
    return ((first!=null&&second!=null && first.equals(second)) || (first==null && second==null));
}

答案 3 :(得分:0)

Objects::equals是最佳选择,但您可以使用

Optional.ofNullable(a).equals(Optional.ofNullable(b))

也是。但是,当您选择Optional方法而不是Objects

时,我真的没有看到任何情况

答案 4 :(得分:-1)

你可以检查两个值而不是引用,

        String a = null;
        String b = null;
        System.out.println(a == b ? "true":"false");

它返回true。