2015-01-20 290 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);