2015-12-07 64 views
3

今天在閱讀拳擊和自動裝箱時,我想出了一個場景,並發現奇怪的行爲,我被困在無限的循環中。for循環在java中的奇怪行爲

我檢查了我的代碼兩次,但我沒有發現任何錯誤。 如果任何人可以看看,並建議我在哪裏做錯了,所以我會出來這個無限循環

請找到下面的代碼。

public class InTheLoop { 

public static final int END = Integer.MAX_VALUE; 
public static final int START = END - 100; 

public static void main(String[] args) { 
    int count = 0; 
    //Infinite loop starts. 
    for (int i = START; i <= END; i++) { 
     count++; 
     System.out.println(count); 
    } 

// This never got printed. 
    System.out.println("hi I am out of for loop" +count); 
    } 
} 
+0

你可能已經在循環中打印了我的值,並且輸出對你來說是自我解釋的。 :) –

回答

2

它是監守已設置我< = END, 一旦達到Integer.MAX_VALUE的,增量(I ++)被執行,這使得它-2147483648(Integer.MAX_VALUE的+ 1)。

因此,這就是爲什麼它沒有打破並繼續運行。

變化,

for (int i = START; i <= END; i++) { 

for (int i = START; i < END; i++) { 

會解決。

+0

如果答案能夠幫助解決您的問題,請將其標記爲已接受。這樣可以幫助其他人尋找類似的問題 – Naruto

0

START2147483547 你把它重複,以END價值2147483647

START達到2147483647它開始與-2147483648

它在你的程序中的整數溢出後。由於int數據類型是Java中的32位,所以任何超過32位的值都會被翻轉。在數字方面,這意味着在Integer.MAX_VALUE(2147483647)上遞增1後,返回的值將是-2147483648。發生此類情況時,JVM不會提出警告或異常。

這已在Java 8中處理溢出拋出ArithmeticException檢查this & this

1

for (int i = START; i <= END; i++) { ==>這裏i <= END;是罪魁禍首。

當循環運行時,i在每次迭代時增加1,然後將其與結束進行比較。所以,

開始 - 我= 2147483547

只要i達到2147483647(整數。MAX_VALUE),它再次增加1,那麼,你就會得到一個溢出和環

這樣的事情發生了:

2147483645 
2147483646 
2147483647 
-2147483648 
-2147483647 
-2147483646. 

你的代碼更改爲:for (int i = START; i < END; i++) {

4

請注意,您的END是等於Integer可以容納的最大可能值(值爲2147483647)。這意味着對於i可能會持有的任何值,i <= END總是如此。當i實際上達到2147483647時,它仍然是<= END。在下一次迭代中,您嘗試將其增加1,這會導致溢出,並且i將變爲-2147483648,這仍然是<= END,並且循環會一直持續。