问题
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;
回答1:
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)
.
回答2:
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);
}
回答3:
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
回答4:
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).
回答5:
You will get a NullPointerException in case 1 and case 3.
You cannot call any methods (like equals()
) on a null object.
回答6:
To prevent NPE while comparing Strings if at least one of them can be null, use StringUtils.equals method which is null-safe.
回答7:
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
}
来源:https://stackoverflow.com/questions/11007781/java-null-string-equals-result