4

在教程(用于实现 xml 解析器)中,我看到了以下代码:

if( "NODENAME".equals(xmlreader.getNodeName()) ) {  // getNodeName() returns java.lang.String
... 
}

有理由写这样的字符串比较吗?

这可能是某种最佳/不好的做法或类似的代码可以带来一些性能优势。我想知道我是否应该在商业项目中使用它。

4

7 回答 7

9

这使您免于NullPointerException.

那就是用来解决不安全的空行为的尤达条件。

在编程术语中,尤达条件(也称为尤达表示法)是一种编程风格,其中表达式的两个部分在条件语句中颠倒。

优点是

交换两个条件值不会改变程序的行为。一个常见的错误是意外地赋值而不是编写条件语句。

于 2013-09-04T10:12:43.003 回答
2

它称为尤达条件,用于避免NullPointerException。关于它在商业项目中的使用,这实际上是一个设计决策——一些开发人员希望保护免受空值的影响,而另一些开发人员则希望采用传统表示法提供的快速失败机制。

于 2013-09-04T10:12:59.297 回答
2

如果你有代码:

if( "NODENAME".equals(xmlreader.getNodeName()) ){...}

它将避免NullPointerException何时xmlreader.getNodeName()null

"NODENAME".equals(null)

将返回 false 而不是NullPointerException.

PS:请记住,如果由于某种原因xmlreader本身为空,则:

"NODENAME".equals(xmlreader.getNodeName())

还是可以扔NullPointerException的。

于 2013-09-04T10:15:22.653 回答
2

通常字符串比较是这样写的,以避免NullPointerException如果xmlreader.getNodeName()为空,因为那样你就会有

if("NODENAME".equals(null)) {
    // ... 
}

相比

if(null.equals("NODENAME")) {
    // ... 
}

这会抛出。

这称为尤达条件:

在此处输入图像描述

如果您希望xmlreader.getNodeName()这样就可以null了,否则我不会依靠它来避免抛出异常,您应该在代码中更早地处理它。

于 2013-09-04T10:18:36.077 回答
0

该方法equals()检查String. 在文字上调用该equals()方法可以节省您,NullPointerException如果xmlReader.getNodeName()返回可能会发生这种情况null。调用equals方法null会导致NullPointerException

于 2013-09-04T10:12:42.477 回答
0

如果您的印象是您也可以使用比较字符串,==那么即使在比较中涉及两个“有意义”相等的字符串,它也会失败,因为==检查它是否是同一个对象。当然,正如其他答案所述,NullPointeException如果您在标准字符串上调用 equals ,则避免使用 a ,就像您的问题一样。

于 2013-09-04T10:28:31.757 回答
0

由于 equals 是 java 中的内置方法,我们需要确保它应该使用对象而不是 null 来调用。所以如果我们用 null 调用,那么我们最终会得到 Null 指针异常。

例如:假设我需要检查字符串 a 是否等于“hai”并且 a 是否来自用户。

那么我不确定'a'是否会为空。因此,如果我使用a.equals("hai"),那么如果 a 变为 null 则不安全,但如果您反转比较,那么无论 a 是否为 null,它总是安全的。

所以总是喜欢"hai".equals(a)避免空指针异常。

于 2013-09-04T10:29:59.673 回答