19

请帮助我 java 中的 string.equals 如何处理空值?异常有问题吗?三种情况:

boolean result1,result2, result3;

    //1st case
    String string1 = null;
    String string2 = null;
    result = string1.equals(string2);
    //2nd case
    String string1 = "something";
    String string2 = null;
    result2 = string1.equals(string2);
    //3rd case 
    String string1 = null;
    String string2 = "something";
    result3 = string1.equals(string2);

结果的价值是什么?我期望这个值:

结果1为真;
结果 2 为假;
结果 3 为假;

4

9 回答 9

51

您不能使用取消引用 (dot, '.') 运算符来访问实例变量或调用实例上的方法(如果该实例是null. 这样做会产生一个NullPointerException.

通常的做法是使用您知道的非空值进行字符串比较。例如,"something".equals(stringThatMayBeNull)

于 2012-06-13T03:22:56.510 回答
20

Objects.equals()如果您使用的是 JDK 7 或更高版本,则用于比较字符串或任何其他对象。它将处理空值而不抛出异常。在此处查看更多信息:how-do-i-compare-strings-in-java

如果您没有运行 JDK 7 或更高版本,您可以像这样复制该equals方法Objects

public static boolean equals(Object a, Object b) {
    return (a == b) || (a != null && a.equals(b));
}
于 2018-06-16T21:06:21.990 回答
12

实际上,您不能在null变量上使用点运算符来调用非静态方法。

尽管如此,一切都取决于重写类的equals()方法Object。在String类的情况下,是:

public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        int n = count;
        if (n == anotherString.count) {
            char v1[] = value;
            char v2[] = anotherString.value;
            int i = offset;
            int j = anotherString.offset;
            while (n-- != 0) {
                if (v1[i++] != v2[j++])
                    return false;
            }
            return true;
        }
    }
    return false;
}

如果你null作为参数传递,两个“if”都会失败,返回false;

您的情况的另一种选择是为您的要求构建一种方法:

public static boolean myEquals(String s1, String s2){
    if(s1 == null)
        return s2 == null;
    return s1.equals(s2);
}
于 2012-06-13T03:32:45.683 回答
3

NullPointerException每当 string1 为 null 并且您在其上调用时,这段代码都会抛出 a equals,就像在任何 null 对象上隐式调用方法时一样。

要检查字符串是否为空,请使用==而不是equals.

尽管由于 NullPointerExceptionsresult1result3不会设置,但 result2 将为 false(如果您在其他结果的上下文之外运行它)。

于 2012-06-13T03:24:18.150 回答
1

在案例 1 和案例 3 中,您将收到 NullPointerException。

您不能equals()在空对象上调用任何方法(如 )。

于 2012-06-13T03:24:04.313 回答
1

为了防止在比较字符串时出现 NPE(如果其中至少一个可以为空),请使用 StringUtils.equals 方法,该方法是空安全的。

于 2016-04-26T11:01:24.447 回答
0

我们不能将点运算符与 null 一起使用,因为这样做会产生 NullPointerException。因此我们可以在我们的程序中利用 try..catch 块。这是解决问题的一种非常粗略的方法,但您将获得所需的输出。

try {
   result = string1.equals(string2);
} catch (NullPointerException ex) {
   result = string2 == null; //This code will be executed only when string 1 is null
}
于 2017-02-21T05:55:14.307 回答
0

这种事情最常见的用例是当我们有一个包含“Y”或“N”来表示布尔值的数据库字段时(这是一个旧系统,不要问)。

因此,我们这样做:

if ("Y".equals(stringObjectThatMayBeNull) ? result : otherResult);

而不是这个:

if (stringObjectThatMayBeNull.equals("Y") ? result : otherResult);

...在执行 .equals 方法时避免了 NullPointerException。

于 2020-12-08T19:04:13.103 回答
0

我迟到了,但你可以使用

StringUtils.equals(str1, str2)

如果您使用的是弹簧

于 2022-02-10T15:00:42.843 回答