繁体   English   中英

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

[英]java unexpected and unaccountable break of loop

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

情况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;
}

&&短路。 这意味着,如果在a && ba计算结果为false ,则不再对b进行计算。 因此,循环不会中断。 发生的事情是没有调用fooMethod ,因为ret在第一次迭代后就为false

您的函数实际上没有中断,因为&&短路,因此不再调用fooMethod(i)

这意味着仅在需要时才评估第二个表达式。 如果您有false && x ,则不必知道x值是什么,因为结果将始终为false

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

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

您的声明ret = ret && fooMethod(i); 将ret =设置为false,因为当i = 0(第一次通过循环)时,fooMethod(i)返回false。

fooMethod(i)在屏幕上显示0,返回假值,并设置ret = ret && fooMethod(i) ,这与说'ret = true && false'表示返回false相同。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM