请帮我看看java中的string.equals如何使用null值?异常有问题吗? 三个案例:
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);
结果的价值是什么?我期待这个值:
result1为真;
result2为false;
result3为false;
答案 0 :(得分:31)
如果该实例为null
,则不能使用取消引用(dot,'。')运算符来访问实例变量或调用实例上的方法。这样做会产生NullPointerException
。
通常的做法是使用您知道的非空字符串进行字符串比较。例如,"something".equals(stringThatMayBeNull)
。
答案 1 :(得分:11)
实际上,你不能在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);
}
答案 2 :(得分:4)
如果您使用的是JDK 7或更高版本,请使用Objects.equals()
来比较字符串或任何其他对象。它将处理空值而不抛出异常。点击此处:how-do-i-compare-strings-in-java
答案 3 :(得分:2)
每当string1为null并且在其上调用NullPointerException
时,该段代码将抛出equals
,就像在任何null对象上隐式调用方法一样。
要检查字符串是否为空,请使用==
而不是equals
。
虽然由于NullPointerExceptions而不会设置result1
和result3
,但result2将为false(如果您在其他结果的上下文之外运行它)。
答案 4 :(得分:1)
在案例1和案例3中,您将获得NullPointerException。
您无法在空对象上调用任何方法(如equals()
)。
答案 5 :(得分:1)
要在比较字符串时阻止NPE(如果其中至少有一个可以为null),请使用nullU安全的StringUtils.equals方法。
答案 6 :(得分:0)
我们不能将dot运算符与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
}
答案 7 :(得分:0)
这类事情的最常见用例是,当我们有一个包含“ Y”或“ N”的数据库字段来表示布尔值时(这是一个旧系统,不要问)。
因此,我们这样做:
if ("Y".equals(stringObjectThatMayBeNull) ? result : otherResult);
代替此:
if (stringObjectThatMayBeNull.equals("Y") ? result : otherResult);
...在执行.equals方法时避免了NullPointerException。