java意外和无法解释的循环中断

时间:2013-08-27 12:39:29

标签: java loops

让我们比较这两种方法......

案例1:功能正常工作

public void fooTestOk() {
    boolean ret = true;
    for (int i = 0; i < 10; i++) {
        boolean r;

        if (fooIf(i))
            r = fooMethod(i);
        else 
            r = fooMethod(i);

        ret = ret && r;
    }
    System.out.println("ret "+ret);
}

输出

它给了我预期的输出(我已经提出了新的排名):

0 1 2 3 4 5 6 7 8 9 ret false

案例2:意外休息的功能

但是这个方法

public void fooTestFail() {
    boolean ret = true;
    for (int i = 0; i < 10; i++) {

        if (fooIf(i))
            ret = ret && fooMethod(i);
        else 
            ret = ret && fooMethod(i);      
    }
    System.out.println("ret "+ret);
}

输出

只给我这个输出,循环必须打破!没有例外!

0 ret false

有人可以解释为什么在这种情况下循环终止没有任何错误

其余代码

以下是我的fooIffooMethod函数:

public boolean fooIf(int i) {
    return i % 2 == 0;
}

public boolean fooMethod(int i) {
    System.out.println(i);
    return i == 5;
}

3 个答案:

答案 0 :(得分:9)

&&短路。这意味着如果在a && b中,a评估为false,则不再评估b。所以,循环不会破坏。发生的事情是fooMethod未被调用,因为ret在第一次迭代后获得false

答案 1 :(得分:1)

你的功能实际上没有中断,fooMethod(i)不再被调用,因为&&是短路的。

这意味着第二个表达式仅在需要时进行评估。如果您有false && x,则无需知道x的值,因为结果始终为false

在您的情况下,ret在第一次迭代后转为false。因此fooMethod(i)的返回值无关紧要,并且不调用该方法。

尝试将ret = ret && fooMethod(i);更改为ret = ret & fooMethod(i);。 结果与第一种情况相同。

答案 2 :(得分:1)

你的陈述ret = ret && fooMethod(i);将ret =设置为false,因为fooMethod(i),当i = 0(第一次循环)时返回false。

fooMethod(i)在屏幕上打印0,返回错误值并设置ret = ret && fooMethod(i),这与说'ret = true&amp;&amp;&amp; false`返回false。

在循环的第一次迭代之后,一旦ret为false,程序就不需要运行fooMethod,因为无论返回什么,结果都将为false,因为ret已经为假:

ret = false && //doesn't matter what else, ret is false

这意味着你的循环第一次运行,打印出0并且此后的每次迭代都无法更改ret的值。一旦完成,它会打印ret和false