2012-10-09 5 views
8

Quando eseguo questa classe il ciclo sembra alla chiusura anticipataper il ciclo di terminazione precoce quando si confrontano a Integer.MAX_VALUE e utilizzando 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); 
    } 

} 

uscita è:

1 
3 
5 
... 
31173 
31175 
End:31177 

Perché finisce qui? È interessante notare che se ho rimosso lo System.out.println(i) nel ciclo for, l'output sarebbe End:-2147483647. Ovviamente il valore in i ha wrapped round.

versione Java che sto utilizzando è

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

Provare a stampare Integer.MAX_VALUE –

+0

Non riesco a ottenere tale risultato. Sembra che il tuo buffer sia pieno o qualcosa del genere. –

+2

Il codice non dovrebbe mai stampare End, anche questo è un bug (anche se leggermente diverso), il loop che hai scritto è infinito, sarò sempre <= Integer.MAX_VALUE. – user439407

risposta

15

suo un bug noto in Java 6. Il JIT ottimizza il ciclo in modo non corretto. Credo che le versioni più recenti di Java non abbiano questo bug.

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

Java 6 Update 16 è poco più di due anni. Vi suggerisco di aggiornare alla versione più recente di Java 6 update 25, se non è possibile aggiornare a Java 7.

BTW Java 6 sarà fine del supporto libero in un paio di mesi (dicembre 2012)

+0

Grande risorsa. +1 –

+0

Cheers :) ..... –

+0

Molto interessante. Stavo per pubblicare il risultato simile, tranne che non conoscevo la causa principale di questo comportamento anormale. –

1

Puoi aggirare il bug JVM utilizzando Integer.MAX_VALUE-1.