Reputation: 3529
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
Reputation: 21
I am late to answer this, but you can use
StringUtils.equals(str1, str2)
if you are using spring
Upvotes: 2
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
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
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
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
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
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
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
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