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