OR比较的Java顺序

时间:2011-06-21 13:38:35

标签: java nullpointerexception

当参数为null时,以下代码片段会抛出NPE吗?

public void doSomething(String string) {
    if (string.trim().equals("") || string==null) {
    [...]
    }
}

我在其他人的代码中找到了这个(其他人应该比我更有经验)。由于我一直面临着这段代码的困难,我想问一下是否应该反转比较,或者Java编译器是否足够聪明以交换操作数。我没有对这段代码的直接控制,也没有因为许多catch块而抛出NPE。

谢谢

6 个答案:

答案 0 :(得分:16)

是。当NullPointerExceptionstring时,该代码片段会抛出null。建议将其更改为以下内容:

public void doSomething(String string) {
    if (string==null || string.trim().equals("")) {
        // ...
    }
}

答案 1 :(得分:4)

它将抛出NullPointerException,因为如果string为空并且您尝试修剪null,则会抛出异常。在尝试trim().

之前尝试进行空检查

答案 2 :(得分:3)

是的,这看起来很狡猾。它几乎肯定是反过来的。 Java逻辑运算符(如C和C ++)具有“短路”功能,首先评估左侧操作数,然后仅在需要时评估右侧操作数。

[注意:您是否刚尝试运行此操作以确定是否会引发异常?]

答案 3 :(得分:2)

相同优先级的二元运算符总是从左到右进行求值,除了赋值(几乎我能想到的每种语言)这在这种情况下很重要,因为||是一个捷径运算符。如果结果已知,即第一个表达式为真,则不评估第二个表达式。因此,使用||&&检查null的正确方法如下所示。

if(text == null || text.method())

if(text != null && text.method2())

顺序是这样的,因为我们用英语从左到右(从上到下)阅读。 C.F.在日语中,您从上到下,从右到左阅读。

答案 4 :(得分:2)

是的,每个合理的IDE都会抱怨这段代码,因为右半部分永远无法评估。

 if (string.trim().equals("") || string==null) {

如果字符串为null,则左侧部分抛出NPE,因此右侧部分永远不会被评估

答案 5 :(得分:2)

尝试使用if(!"".equals(someString)),这样可以避免显式的空检查