我有一段代码,涉及两个条件进入while循环,但我对输出和以下代码的预期结果感到困惑:
while (curr != null && key.compareTo(curr.getKey()) > 0) {
prev = curr;
curr = prev.getNext();
if (curr == null) {
System.out.println(curr + " is null");
}
}
当我运行此代码时,我希望它抛出一个空指针异常,因为curr为null并且我在打印消息后调用null的方法,但它正常退出循环而我想知道这是否属于正常行为?从这里看来,它确实一次评估一个条件,但我认为while循环在一个布尔表达式中评估括号内的所有内容?
我运行了一个测试,我将操作数换成&&反过来,发现它确实抛出一个空指针异常然后!这是什么原因?
Q值。 while循环条件是作为一个整体进行评估还是在决定是否进入循环之前一次评估一个条件?
答案 0 :(得分:4)
&&
是短路(或短手)操作员。它将评估第一个条件,如果条件为真则只评估第二个条件。
因此,如果我的条件是conditon1 && condition2
,当且仅当条件1为真时,它将评估condition2。
所以在你的情况下,它将评估非null条件(curr != null
),如果它失败,那么它不会评估另一个,因此没有NullPointerException,因此你看到while循环正常退出。
答案 1 :(得分:0)
(curr != null && key.compareTo(curr.getKey())
&安培;&安培;在运行正确的
之前确保left为true&&和||运营商"短路",这意味着如果没有必要,他们不会评估右侧。
&和|运算符,当用作逻辑运算符时,总是评估双方。
以下是对此Java logical operator short-circuiting
的一个非常好的解释每个操作员只有一例短路,他们 是:
false && ... - it is not necessary to know what the right hand side is, the result must be false true || ... - it is not necessary to know what the right hand side is, the result must be true