空指针异常取决于或语句的顺序

时间:2015-04-29 17:39:16

标签: java

如果数组包含空值或空字符串,则此for循环应该通过String数组并使值hasEmpty为true。以下代码给出了NullPointerException。

String[] names = {null, "B", "C"};
    boolean hasEmpty = false;
    for(int i = 0; i<names.length; i++){
        if ((names[i].equals("")) || (names[i] == null))
            hasEmpty = true;
    }

但是,如果我在if子句中更改OR语句的顺序,则以下代码似乎有效。有人能告诉我为什么会这样吗?

String[] names = {null, "B", "C"};
    boolean hasEmpty = false;
    for(int i = 0; i<names.length; i++){
        if ((names[i] == null) || (names[i].equals("")))
            hasEmpty = true;
    }

4 个答案:

答案 0 :(得分:3)

因为||是短路运营商。一旦它找到一个真实的操作数,从左到右,它甚至不会评估其他操作数(因为true or anything总是为真)。

同样适用于&amp;&amp;:如果第一个操作数为false,它会评估其他操作数,因为false && anything始终为false。

答案 1 :(得分:0)

正如预期的那样。

如果OR语句的第一个参数为true,则不需要评估另一个。

对于AND语句和false值也是如此。如果第一个是假的,则无需评估第二个。

答案 2 :(得分:0)

if语句中的代码被懒惰地评估,这意味着如果他们知道他们将会失败,他们就可以退出。第一个失败是因为您正在调用null.equals(""),这会引发错误。第二个成功是因为您正在检查names[i]是否为null,如果是,则退出循环。

if ((names[i] == null ) ||
    (names[i].equals(""))) // Don't bother checking if names[i] is null


if ((names[i].equals("")) ||
    (names[i] == null)) // Check null only if names[i].equals("") is false

||转换为&&可能会更有意义:

if (names[i] != null && !names.equals(""))

答案 3 :(得分:0)

String[] names = {null, "B", "C"};

boolean hasEmpty = false;

for(int i = 0; i<names.length; i++){
       /* change here */
        if (("".equals(names[i])) || (names[i] == null))
            hasEmpty = true;
    }

原因: 您正在尝试将 null 值与 empty 字符串进行比较,因此在第一个代码段中您将获得NullPointerException。但在第二个代码中,你改变了两个条件的位置。 OR条件的评估如下:

如果满足第一个条件,则仅检查下一个部分。

表示 if(a || b)

如果a为真,则不会评估b。 但如果a为假,那么b将被评估。