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

jto*_*szk 1 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);
}
Run Code Online (Sandbox Code Playgroud)

产量

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

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);
}
Run Code Online (Sandbox Code Playgroud)

产量

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

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;
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*aux 9

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