2015-01-20 167 views
1

我注意到当我在我的java程序中使用while循环时,使用布尔类型来终止它似乎并没有工作。我输入了一些简单的东西来测试它。代码通过i = 9完成,然后将测试打印为false。为什么我的while循环终止?

public class LoopTesting { 


    public static void main(String[] args) { 

     boolean test = true; 

     while(test) { 
      for (int i = 1; i < 10; i++) { 
       System.out.println(i); 
       if(i == 5) test = false; 
      } 
     } 
     System.out.println(test); 
    } 
} 

编辑:针对afzalex的回答我测试此代码:

while(test) { 
     for (int i = 1; i < 10; i++) { 
      System.out.println(i); 

     } 

     test = false; 

     for(int i = 11; i < 20; i++) { 
      System.out.println(i); 
     } 
    } 

,并打印到19

+2

它实际上工作正常,印刷1..9和“测试”,正是预计 – vlatkozelka 2015-01-20 19:42:16

+1

while循环结束,这就是为什么它打印'FALSE'。 – eckes 2015-01-20 19:46:54

+1

@alfasin这是一个单线程(主线程)的例子,你不需要关心同步或并发问题和优化。 – eckes 2015-01-20 19:48:58

回答

6

您在for循环内更改了test值。但for循环的条件是i < 10,而不是test
因此for循环继续迭代直到它结束。
然后当终止,因为你已经设置testfalse当控制在for循环内。

4

这是你想要

while(test) { 
     for (int i = 1; i < 10; i++) { 
      System.out.println(i); 
      if(i == 5) { 
      test = false; 
      break; 
      } 
     } 
    } 

以上什么只需

int i = -1; 

while(test) { 
     i++; 
     System.out.println(i); 
     if(i == 5) { 
      test = false; 
     } 
} 
0

您的逻辑错误。 test变量在您的内部for循环完成之前未被检查。如果你只想迭代5次,你可以这样做:

while(test) { 
    for (int i = 1; i < 10; i++) { 
     System.out.println(i); 
     if(i == 5){ 
      test = false; 
      break; 
     } 
    } 
} 

但你可能想要做这样的事情:

... 
int i = 1; 
while(test) { 
    if(i == 5) 
     test = false 
    else i++; 
} 
1

while循环不关闭的问题,是因为你有在您的代码中嵌入for循环。会发生什么,是您的代码将进入while循环,因为while(test)将导致true。然后,您的代码将进入for循环。在for循环中,您的代码从1-10开始循环。此循环基于Integeri。内部循环基本上是说while(i < 10),所以这个内部循环不受boolean测试值的影响。

while(test) { // This loop will continue to run until test == false 
     for (int i = 1; i < 10; i++) { // This loop will continue to run until i > 9 
       test = false; // This will execute on the first loop of the inner loop, but it is not checked at the outer loop until the inner loop is complete 
     } 
    } 

希望是有道理的。你的问题是布尔值对应于外部循环,没有任何东西阻止内部循环运行。

0

下面是你如何替换第二个问题的代码,以及如何替换简单的if/goto。这也许是更容易理解你:

loopA: // while 
if (test) { 
    int i1 = 1; 
    loopB: // for 1 
    if (i1 < 10) { 
    System.out.println(i1); 
    i1++; 
    goto loopB; 
    } 

    test = false; 

    int i2= 11; 
    loopC: // for 2 
    if (i2 < 20) { 
    System.out.println(i2); 
    i2++; 
    goto loopC; 
    } 
    goto loopA; 
} 
System.out.println(test);