【问题标题】:while loop condition evaluationwhile 循环条件评估
【发布时间】:2015-03-08 15:51:25
【问题描述】:

我的代码 sn-p 涉及进入 while 循环的两个条件,但我对以下代码的输出和预期结果感到困惑:

while (curr != null && key.compareTo(curr.getKey()) > 0) {
  prev = curr;
  curr = prev.getNext();
  if (curr == null) {
    System.out.println(curr + " is null");
  }
}

当我运行这段代码时,我希望它会抛出一个空指针异常,因为 curr 为空并且我正在调用一个空方法,在打印出消息之后,但是它正常退出循环,我想知道这是否是正常行为?从这里看来,它确实一次评估一个条件,但我认为 while 循环在一个布尔表达式中评估括号内的所有内容?

我运行了一个测试,将操作数换成 && ,发现它确实抛出了一个空指针异常!这是什么原因?

问。 while 循环条件是作为一个整体进行评估,还是在决定是否进入循环之前一次评估一个条件?

【问题讨论】:

  • 请注意,它与 while 循环行为无关。评估 && 的规则对于 if 条件、将结果分配给布尔变量等都是相同的。

标签: java loops while-loop


【解决方案1】:

&& 是短路(或短手)运算符。它将评估第一个条件,如果条件为真,则只评估第二个条件。

所以如果我的条件是conditon1 && condition2,当且仅当条件1 为真时,它才会评估条件2。

因此,在您的情况下,它将评估非空条件 (curr != null),如果失败,则不会评估另一个条件,因此不会评估 NullPointerException,因此您会看到 while 循环正常退出。

【讨论】:

  • 哇,我不知道这个;一直以来,我一直认为要对条件进行整体评估。
【解决方案2】:
 (curr != null && key.compareTo(curr.getKey()) 

&& 确保 left 在运行 right 之前为 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

【讨论】:

    猜你喜欢
    • 2018-06-23
    • 2014-06-03
    • 1970-01-01
    • 2010-11-17
    • 1970-01-01
    • 2011-12-17
    • 2010-10-02
    • 2017-03-05
    • 1970-01-01
    相关资源
    最近更新 更多