user1097772
user1097772

Reputation: 3529

Java null String equals result

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;

Upvotes: 26

Views: 139186

Answers (9)

Ankur Bansal
Ankur Bansal

Reputation: 21

I am late to answer this, but you can use

StringUtils.equals(str1, str2)

if you are using spring

Upvotes: 2

Erk
Erk

Reputation: 1209

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

And if you're not running JDK 7 or later you can copy the equals method from Objects like this:

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

Upvotes: 24

ESR
ESR

Reputation: 46

Our most common use-case of this type of thing is when we have a database field that contains "Y" or "N" to represent a Boolean (it's an old system, don't ask).

Thus, we do this:

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

Instead of this:

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

... which avoids a NullPointerException when executing the .equals method.

Upvotes: 0

elias
elias

Reputation: 15480

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

Upvotes: 12

Sam
Sam

Reputation: 149

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
}

Upvotes: 0

AniaG
AniaG

Reputation: 254

To prevent NPE while comparing Strings if at least one of them can be null, use StringUtils.equals method which is null-safe.

Upvotes: 2

sjr
sjr

Reputation: 9875

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

Upvotes: 57

FThompson
FThompson

Reputation: 28687

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

Upvotes: 3

Chip
Chip

Reputation: 3316

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

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

Upvotes: 1

Related Questions