Java 中的无限循环

2022-08-31 12:11:31

看看Java中的以下无限循环。它会导致其下方的语句出现编译时错误。while

while(true) {
    System.out.println("inside while");
}

System.out.println("while terminated"); //Unreachable statement - compiler-error.

但是,以下相同的无限循环工作正常,并且不会发出任何错误,其中我只是用布尔变量替换了条件。while

boolean b=true;

while(b) {
    System.out.println("inside while");
}

System.out.println("while terminated"); //No error here.

在第二种情况下,循环之后的语句显然无法访问,因为布尔变量为真,编译器根本没有抱怨。为什么?b


编辑:以下版本的 被困在一个无限循环中是显而易见的,但即使它下面的语句不会发出编译器错误,即使循环中的条件总是这样,因此,循环永远不会返回,并且可以由编译器在编译时确定。whileiffalse

while(true) {

    if(false) {
        break;
    }

    System.out.println("inside while");
}

System.out.println("while terminated"); //No error here.

while(true) {

    if(false)  { //if true then also
        return;  //Replacing return with break fixes the following error.
    }

    System.out.println("inside while");
}

System.out.println("while terminated"); //Compiler-error - unreachable statement.

while(true) {

    if(true) {
        System.out.println("inside if");
        return;
    }

    System.out.println("inside while"); //No error here.
}

System.out.println("while terminated"); //Compiler-error - unreachable statement.

编辑:和 相同。ifwhile

if(false) {
    System.out.println("inside if"); //No error here.
}

while(false) {
    System.out.println("inside while");
    // Compiler's complain - unreachable statement.
}

while(true) {

    if(true) {
        System.out.println("inside if");
        break;
    }

    System.out.println("inside while"); //No error here.
}      

以下版本的 也陷入了无限循环。while

while(true) {

    try {
        System.out.println("inside while");
        return;   //Replacing return with break makes no difference here.
    } finally {
        continue;
    }
}

这是因为即使语句在块本身内遇到它,也始终执行该块。finallyreturntry


答案 1

编译器可以轻松明确地证明第一个表达式总是导致无限循环,但对于第二个表达式来说,这并不容易。在你的玩具示例中,这很简单,但如果:

  • 变量的内容是从文件中读取的吗?
  • 变量不是本地的,可以被另一个线程修改?
  • 变量依赖于某些用户输入?

编译器显然没有检查您的简单情况,因为它完全放弃了这条路。为什么?因为规范禁止它要困难得多。请参阅第 14.21 节

(顺便说一句,我的编译器声明变量时确实会抱怨。final


答案 2

根据规范,以下是关于 while 语句的介绍。

while 语句可以正常完成,但至少存在以下一项为真:

  • while 语句是可访问的,条件表达式不是值为 true 的常量表达式。
  • 有一个可访问的中断语句退出 while 语句。\

因此,编译器只会说,如果 while 条件是具有 true 值的常量,或者 while 中存在 break 语句,则 while 语句后面的代码无法访问。在第二种情况下,由于 b 的值不是常量,因此它不认为它后面的代码是无法访问的。该链接背后有很多更多信息,可以为您提供有关哪些内容不被视为无法访问以及哪些内容不被视为无法访问的更多详细信息。


推荐