为什么for循环的条件部分中的“ False”显示错误,而“ True”却能正常工作?

时间:2019-11-17 15:47:00

标签: java loops for-loop

for(int i=0;true;i++){
    System.out.println("hi");
    break;
}

for(int i=0;false;i++){
    System.out.println("hi");
    break;
}

第一个代码执行完美,但是第二个代码显示以下错误:

prog.java:12: error: unreachable statement
    for(int i=0; false;i++){
                           ^

1个错误

4 个答案:

答案 0 :(得分:3)

您得到的错误是:

  

无法到达的声明

,它引用for块中的代码。
这意味着该行:

System.out.println("hi");

将永远不会执行,因为for的条件(终止表达式)从一开始就是正确的(并且永远是false。)
在这里找到有关的更多信息:The for Statement

答案 1 :(得分:3)

Java中无法访问的代码是编译错误。在您编写的第二个for循环中,“ false”表示控件将永远不会进入“ for循环主体”,从而使其无法访问代码,从而导致编译错误。

答案 2 :(得分:2)

这里有几点要学习。

  1. 当编译器在编译时可以检测到部分代码不可访问时,它将对其进行标记,以帮助您尽快检测到问题。因此,在一个条件为if的{​​{1}}语句中,该语句部分不可访问,并被标记为这样。

  2. falsefor (init; condition;expr) statement这样的循环甚至在运行该语句之前都要检查其条件。因此,如果条件为while (condition) statement,则该语句将永远不会执行。因此,发生同样的事情就像在条件为false的{​​{1}}语句中一样。

  3. 必须在编译时解决条件。像

    if

    在编译时不被认为是已知的,但是falseboolean a = false; while (a) ... 在编译时是已知的,因为它们是文字。

  4. false不会发生这种情况,因为当编译器知道条件为true时,它知道循环将至少进入一次。因此,true没有类似的错误,实际上,true类型的循环非常普遍。

答案 3 :(得分:1)

请记住,编译器可能将其检测为无法访问的代码的某些情况标记为无效代码。例如:

这可以编译并正常运行(尽管Eclipse中的默认设置是发出警告)。

   public int foo() {
      if (true) {
         return 10;
      }
      return 5; // dead code (but it is definitely unreachable).
   }

另一方面,这也是编译器可以识别为无法访问的代码,但不能(幸运的是)的东西。

DEBUG在程序执行期间永远不能更改。由final保证。但是代码可以很好地编译并运行。实际上,整个if clause已被删除,并且没有出现在字节码中。这对于将这样的语句撒入代码中然后通过简单地将DEBUG从true更改为false来删除它们很有用。

   final static boolean DEBUG = false; 
   public int bar(int v) {

      if (DEBUG) {
         System.out.println("v = " + v);
      }
      return v*5;
   }