Java null String equals result

2020-02-10 04:14发布

Please help me how does the string.equals in java work with null value? Is there some problem with exceptions? Three cases:

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);

What the values of results are? I expect this values:

result1 is true;
result2 is false;
result3 is false;

7条回答
我欲成王,谁敢阻挡
2楼-- · 2020-02-10 04:29

Use Objects.equals() to compare strings, or any other objects if you're using JDK 7 or later. It will handle nulls without throwing exceptions. See more here: how-do-i-compare-strings-in-java

查看更多
Explosion°爆炸
3楼-- · 2020-02-10 04:32

We cannot use dot operator with null since doing so will give NullPointerException. Therefore we can take advantage of try..catch block in our program. This is a very crude way of solving your problem, but you will get desired output.

try {
   result = string1.equals(string2);
} catch (NullPointerException ex) {
   result = string2 == null; //This code will be executed only when string 1 is null
}
查看更多
Fickle 薄情
4楼-- · 2020-02-10 04:38

Indeed, you cannot use the dot operator on a null variable to call a non static method.

Despite this, all depends on overriding the equals() method of the Object class. In the case of the String class, is:

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;
}

If you pass null as parameter, both "if" will fail, returning false;

An alternative for your case is to build a method for your requirements:

public static boolean myEquals(String s1, String s2){
    if(s1 == null)
        return s2 == null;
    return s1.equals(s2);
}
查看更多
ゆ 、 Hurt°
5楼-- · 2020-02-10 04:39

You cannot use the dereference (dot, '.') operator to access instance variables or call methods on an instance if that instance is null. Doing so will yield a NullPointerException.

It is common practice to use something you know to be non-null for string comparison. For example, "something".equals(stringThatMayBeNull).

查看更多
孤傲高冷的网名
6楼-- · 2020-02-10 04:39

You will get a NullPointerException in case 1 and case 3.

You cannot call any methods (like equals()) on a null object.

查看更多
虎瘦雄心在
7楼-- · 2020-02-10 04:40

That piece of code will throw a NullPointerException whenever string1 is null and you invoke equals on it, as is the case when a method is implicitly invoked on any null object.

To check if a string is null, use == rather than equals.

Although result1 and result3 will not be set due to NullPointerExceptions, result2 would be false (if you ran it outside the context of the other results).

查看更多
登录 后发表回答