一般来说,
之间是否存在差异if("x".equalsIgnoreCase(myStrVar))
和
if(myStrVar.equalsIgnoreCase("x"))
因为第一个不会导致空指针异常,但第二个会在两种情况下myStrVar
都为空吗?
答案 0 :(得分:7)
是的,这是正确的。但是,这并不意味着您应该始终使用前者(“安全”)版本。
如果你绝对相信myStrVal
是非空的 - 意味着它为空将表示错误 - 我可能会使用第二种形式。
if (x == 0)
而不是if (0 == x)
所以:
myStrVal
为空的特殊处理,请执行第一次检查myStrVal
视为空,请使用第一个表单myStrVal
视为错误,请使用第二种形式答案 1 :(得分:1)
如果我的问题正确,答案是“是”。 :)
答案 2 :(得分:1)
您的声明第二个版本会导致NullPointerException
,而第一个版本不会,这是正确的。
答案 3 :(得分:1)
如果NullPointerException
显然会在第二种情况下引发myStrVar == null
。您无法在equalsIgnoreCase(String str)
上致电null
,但可以传递null
作为参数。
答案 4 :(得分:1)
确切地说,因为实现是
public boolean equalsIgnoreCase(String anotherString) {
return (this == anotherString) ? true :
(anotherString != null) && (anotherString.count == count) &&
regionMatches(true, 0, anotherString, 0, count);
}
这是(Yoda条件)规则的一个很好的例子:“你应该从常量开始,以避免空指针解引用”。