在教程(用于实现 xml 解析器)中,我看到了以下代码:
if( "NODENAME".equals(xmlreader.getNodeName()) ) { // getNodeName() returns java.lang.String
...
}
有理由写这样的字符串比较吗?
这可能是某种最佳/不好的做法或类似的代码可以带来一些性能优势。我想知道我是否应该在商业项目中使用它。
这使您免于NullPointerException.
那就是用来解决不安全的空行为的尤达条件。
在编程术语中,尤达条件(也称为尤达表示法)是一种编程风格,其中表达式的两个部分在条件语句中颠倒。
优点是
交换两个条件值不会改变程序的行为。一个常见的错误是意外地赋值而不是编写条件语句。
它称为尤达条件,用于避免NullPointerException
。关于它在商业项目中的使用,这实际上是一个设计决策——一些开发人员希望保护免受空值的影响,而另一些开发人员则希望采用传统表示法提供的快速失败机制。
如果你有代码:
if( "NODENAME".equals(xmlreader.getNodeName()) ){...}
它将避免NullPointerException
何时xmlreader.getNodeName()
是null
"NODENAME".equals(null)
将返回 false 而不是NullPointerException
.
PS:请记住,如果由于某种原因xmlreader
本身为空,则:
"NODENAME".equals(xmlreader.getNodeName())
还是可以扔NullPointerException
的。
通常字符串比较是这样写的,以避免NullPointerException
如果xmlreader.getNodeName()
为空,因为那样你就会有
if("NODENAME".equals(null)) {
// ...
}
相比
if(null.equals("NODENAME")) {
// ...
}
这会抛出。
这称为尤达条件:
如果您希望xmlreader.getNodeName()
这样就可以null
了,否则我不会依靠它来避免抛出异常,您应该在代码中更早地处理它。
该方法equals()
检查String
. 在文字上调用该equals()
方法可以节省您,NullPointerException
如果xmlReader.getNodeName()
返回可能会发生这种情况null
。调用equals
方法null
会导致NullPointerException
如果您的印象是您也可以使用比较字符串,==
那么即使在比较中涉及两个“有意义”相等的字符串,它也会失败,因为==
检查它是否是同一个对象。当然,正如其他答案所述,NullPointeException
如果您在标准字符串上调用 equals ,则避免使用 a ,就像您的问题一样。
由于 equals 是 java 中的内置方法,我们需要确保它应该使用对象而不是 null 来调用。所以如果我们用 null 调用,那么我们最终会得到 Null 指针异常。
例如:假设我需要检查字符串 a 是否等于“hai”并且 a 是否来自用户。
那么我不确定'a'是否会为空。因此,如果我使用a.equals("hai")
,那么如果 a 变为 null 则不安全,但如果您反转比较,那么无论 a 是否为 null,它总是安全的。
所以总是喜欢"hai".equals(a)
避免空指针异常。