当前位置: 首页 > 知识库问答 >
问题:

循环时无法到达的代码

松刚豪
2023-03-14

当我编译代码的时候

public static void main(String [] args) {

        int x = 0;        

        while(false)
        {                        
            System.out.println(hello);
        }
    }

它显示编译时错误无法到达的代码。

但是当我把代码修改成

public static void main(String [] args) {

        int x = 0;        
        boolean result = false;
        while(result)
        {                        
            x=4;
        }
    }

很好用。

谁能告诉我这种行为背后的原因吗。

共有3个答案

燕飞文
2023-03-14

编译器的行为在Java语言规范第14.21节中有明确规定。遥不可及的陈述。

这里有一个关键的报价,它直接回答了你的问题:

本节专门对“可达”一词进行精确解释其思想是,从包含语句的构造函数、方法、实例初始值设定项或静态初始值设定项的开头到语句本身,必须有一些可能的执行路径。分析考虑了报表的结构。除了对while、do和条件表达式具有常数值true的语句进行特殊处理外,在流分析中不考虑表达式的值。

应煌
2023-03-14

在下面的语句中使用常量false

  while(false)

在编译时被解析为false,因此编译器抱怨无法访问代码

但是当你使用一个变量时:

    boolean result = false;
    while(result)

编译器在编译时不确定它的值,因此不会抱怨。

厉令
2023-03-14

这是因为boolean结果=false不是常量表达式,而false是。如果您尝试下面的代码,它也不会编译,因为结果现在是常量:

final boolean result = false;
while(result) { x=4; }

然而,这将被编译,因为result不再是常量变量:

final boolean result;
result = false;
while(result) { x=4; }

另请参见:为什么Java编译器不理解这个变量总是初始化的?进行类似的讨论。

 类似资料:
  • 迭代器无效是如何处理的,而不是循环? 例如,这段代码不起作用,因为迭代器在插入后无效: 但是,如果我用这个for循环替换while循环,它会正确编译和运行: 为什么for循环有效而while循环无效?

  • 问题内容: 我在用Java做一些小程序。我知道,如果我编写 程序,程序将在此循环中冻结。如果代码是这样的: 测试1: 编译器抛出错误: 我不知道这个错误存在。但是我知道为什么会抛出它。当然, 第6行无法访问 ,从而导致编译问题。然后,我对此进行了测试: 测试2: 由于某种原因 ,程序正常运行 (控制台先打印“开始”,然后冻结)。编译器无法检查内部, 并无法访问。确保我尝试过: 测试3: 与测试2相

  • 问题内容: 此代码将导致无限循环的机会是什么? 实际上,这会导致无限循环。我的怀疑是因为我没有服用,是真的吗? 问题答案: 是。除非您不打电话,否则它将永远不会继续进行下一项。Beause 将返回您已在列表/集中添加的对象。

  • 我做了一个程序,利用3类,锦标赛,游戏和俱乐部。我在比赛和俱乐部中的方法都很好,但在冠军联赛的主要方法中,我遇到了问题。我有两个ArrayList,一个是with objects club,另一个是with objects game。在我的主要方法中,我使用while循环和切换用例创建了一个菜单,用户可以1-创建俱乐部,2-创建游戏,3-列出结果,4-注册结果。然而,我的所有案例都有相同的问题:不

  • 问题内容: 以下代码给出了编译器错误 有时出于测试目的,希望防止某个方法被调用,因此一种快速执行此方法(而不是在使用 该方法的位置处将其注释掉)的方法是立即从该方法返回,以便该方法不执行任何操作。然后,我总是做些什么来解决编译器错误,这是 我很好奇,为什么会出现编译器错误?它会以某种方式破坏Java字节码,是为了保护程序员还是其他? 同样(这对我来说更有趣),如果将Java编译为字节码可以进行任何

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