字符串中的“空变量检查”

时间:2011-09-15 16:14:12

标签: java string

一般来说,

之间是否存在差异
if("x".equalsIgnoreCase(myStrVar))

if(myStrVar.equalsIgnoreCase("x"))

因为第一个不会导致空指针异常,但第二个会在两种情况下myStrVar都为空吗?

5 个答案:

答案 0 :(得分:7)

是的,这是正确的。但是,这并不意味着您应该始终使用前者(“安全”)版本。

如果你绝对相信myStrVal是非空的 - 意味着它为空将表示错误 - 我可能会使用第二种形式。

  • 我觉得它更具可读性(就像我写if (x == 0)而不是if (0 == x)
  • 一样
  • 如果值 为null,那么最好尽可能早地爆发,而不是在意外状态下继续

所以:

  • 如果您希望myStrVal为空的特殊处理,请执行第一次检查
  • 如果您希望以与任何其他非“x”值相同的方式将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条件)规则的一个很好的例子:“你应该从常量开始,以避免空指针解引用”。