2012-10-09 9 views
8

Gdy uruchomię to klasa dla pętli wydaje się zakończyć wczesnąpętli kończącej wcześnie przy porównywaniu do Integer.MAX_VALUE i używając System.out.println

class Test { 

    public static void main(String[] args) { 
     int result = 0; 
     int end = Integer.MAX_VALUE; 
     int i; 
     for (i = 1; i <= end; i += 2) { 
      System.out.println(i); 
     } 
     System.out.println("End:" + i); 
    } 

} 

wyjście jest:

1 
3 
5 
... 
31173 
31175 
End:31177 

Dlaczego czy to się kończy? Interesujące, jeśli usunęłem System.out.println(i) w pętli for, wyjściem byłby End:-2147483647. Oczywiście wartość w i ma wrapped round.

wersja Java używam jest

Java(TM) SE Runtime Environment (build 1.6.0_16-b01) 
Java HotSpot(TM) 64-Bit Server VM (build 14.2-b01, mixed mode) 
+1

Spróbuj wydrukować Integer.MAX_VALUE –

+0

Nie otrzymuję takich danych wyjściowych. Wydaje się, że twój bufor jest wypełniony, czy coś. –

+2

Kod nie powinien nigdy drukować Koniec, to również błąd (choć nieco inny), napisana pętla jest nieskończona, zawsze będę <= Integer.MAX_VALUE. – user439407

Odpowiedz

15

jego znany błąd w Javie 6. JIT optymalizuje pętli nieprawidłowo. Wierzę, że nowsze wersje Javy nie mają tego błędu.

http://vanillajava.blogspot.co.uk/2011/05/when-jit-gets-it-wrong.html

Java 6 Update 16 jest nieco ponad dwa lata. Proponuję uaktualnić do najnowszej wersji Java 6 Update 25, jeśli nie można uaktualnić do Java 7.

BTW Java 6 będzie End bezpłatną pomocą w ciągu kilku miesięcy (grudzień 2012)

+0

Świetne zasoby. +1 –

+0

Wiwaty :) ..... –

+0

Bardzo interesujące. Właśnie miałem opublikować podobne stwierdzenie, z wyjątkiem tego, że tak naprawdę nie znałem głównej przyczyny tego nienormalnego zachowania. –

1

Można obejść błąd JVM za pomocą metody Integer.MAX_VALUE-1.

Powiązane problemy