当前位置: 首页 > 面试题库 >

Java中的无限循环

束向荣
2023-03-14
问题内容

请看下面的whileJava 无限循环。它导致其下面的语句的编译时错误。

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为true,但编译器根本没有抱怨。为什么?

编辑:while显然,以下版本的卡在无限循环中,但是即使if循环中的条件始终存在false,因此循环下面的语句也不会对该语句下的语句发出任何编译器错误,因此循环永远不会返回,并且可以由编译器在以下位置确定编译时本身。

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

这是因为finally即使return语句在try块本身中遇到之前也总是执行该块。


问题答案:

编译器可以轻松而明确地证明第一个表达式 始终会 导致无限循环,但第二个表达式则不那么容易。在您的玩具示例中,这很简单,但是如果:

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

编译器显然不会检查您的简单情况,因为它完全放弃了这条路。为什么?因为它 更难
被禁止规范。参见第14.21节:

  • http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.21-300-M

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



 类似资料:
  • 问题内容: 我正在使用第三方库来处理大量数据集。该过程偶尔会陷入无限循环(或被阻塞- 不知道为什么并且无法进入代码)。我想在设定的时间后消除这个问题,然后继续处理下一个案件。一个简单的例子是: processData通常最多需要1秒。我想设置一个计时器,该计时器在10秒后杀死processData() 编辑我将不胜感激代码片段(我没有在使用Thread的过程中练习过)。执行器方法看起来很有用,但我

  • 你好,有人能解释一下为什么这会形成一个无限循环吗?谢谢!

  • 你好,有人能解释一下为什么这会形成一个无限循环吗。谢谢

  • 问题内容: 作为继承这个帖子我运行到一个无限循环,导致我的电脑死机。或者,不是很好:它似乎导致Java窗口(JFrame)不断获得焦点/获得图标化和无限地规范化。因此, 请勿尝试按原样运行代码 。该程序不允许您关闭它,也不能通过任务管理器关闭它。 我已经给出了一个完整的代码示例,您可以运行它- 正如通常所建议的那样。由于它是实际程序的简化版本,因此某些代码似乎是多余的(尤其是中间的方法)。重要的方

  • 我真的不知道这个问题。。。 如果数字不正确,块将捕获异常,当我输入-1或0时,它将捕获异常并要求我再次输入数字。。。但如果我键入类似asdasd的内容,它将运行一个无限循环。

  • 问题内容: 我一直在使用React 16.7-alpha中的新钩子系统,并且当我正在处理的状态是对象或数组时陷入useEffect的无限循环中。 首先,我使用useState并使用一个空对象启动它,如下所示: 然后,在useEffect中,我再次使用setObj将其设置为空对象。作为第二个参数,我传递了[obj],希望如果对象的 内容 没有更改,它也不会更新。但是它一直在更新。我猜是因为不管内容如