Java 正确计算字符串等价性并处理空值

Java 正确计算字符串等价性并处理空值,java,string,Java,String,使用equal方法时,如果要比较的字符串为null,则会导致错误: public static void main(String[] args) { String nullString = null; String nullString2 = null; System.out.println(nullString.equals(nullString2)); } 结果: 线程“main”java.lang.NullPointerException中出现异常 Main.Ma

使用equal方法时,如果要比较的字符串为null,则会导致错误:

public static void main(String[] args) {
    String nullString = null;
    String nullString2 = null;
    System.out.println(nullString.equals(nullString2));
}
结果: 线程“main”java.lang.NullPointerException中出现异常 Main.Main(Main.java:11)

这会导致我想做的事情出现问题,因为我需要计算字符串,并且使用==运算符经常会导致等价字符串计算为false

在我的实际应用程序中,如果我有以下代码作为循环的一部分,这就是我得到的输出:

System.out.println(pointPerson == storyTasks.get(i).getPointPerson());
if (pointPerson != null) {
    System.out.println(pointPerson.equals(storyTasks.get(i).getPointPerson()));
}
假的 符合事实的 错误的 真的

那么,如何防止程序崩溃,同时正确计算字符串呢

我将在我的实际计划中作为长if声明的一部分进行评估:

                        if (!name.equals(storyTasks.get(i).getName())
                                || !desc.equals(storyTasks.get(i)
                                        .getDescription())
                                || !est.equals(storyTasks.get(i)
                                        .getOriginalEstimate())
                                || !taskStatus.equals(storyTasks.get(i)
                                        .getStatus())
                                || !pointPerson.equals(storyTasks.get(i)
                                        .getPointPerson())) {
                             //code
                        }

使用简单的辅助方法:

public static boolean equalsOrNull(Object o1, Object o2)
{
    if (o1 == null && o2 == null) return true;
    if (o1 == null) return false;
    if (o2 == null) return false;
    return o1.equals(o2);
}
您可以从Apache Commons使用。

您也可以使用(从Java 7开始)

如果您想自己编写支持早期版本Java的代码:

public static boolean equals(Object a, Object b) {
    return (a == b) || (a != null && a.equals(b));
}

@Vandel简单地说:
(str1==null?str2==null:str1.equals(str2))