2012-10-09 19 views
8

Cuando ejecuto esta clase el bucle parece terminar anticipadamentepara el bucle de terminación temprana cuando se compara con Integer.MAX_VALUE y utilizando 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); 
    } 

} 

de salida es:

1 
3 
5 
... 
31173 
31175 
End:31177 

Por qué ¿termina ahí? Curiosamente, si eliminé el System.out.println(i) en el ciclo for, la salida sería End:-2147483647. Obviamente, el valor en i tiene wrapped round.

versión de Java que estoy usando es

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

Intenta imprimir Integer.MAX_VALUE –

+0

No obtengo ese resultado. Parece que tu buffer está lleno o algo así. –

+2

El código no debe imprimirse End, también es un error (aunque ligeramente diferente), el ciclo que escribió es infinito, siempre seré <= Integer.MAX_VALUE. – user439407

Respuesta

15

Es un fallo conocido en Java 6. El JIT optimiza el bucle de forma incorrecta. Creo que las versiones más recientes de Java no tienen este error.

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

Java 6 Update 16 es un poco más de dos años de edad. Yo sugeriría que actualice a la última versión de Java 6 Update 25 si no se puede actualizar a Java 7.

Por cierto Java 6 será Fin de soporte gratuito en un par de meses (diciembre de 2012)

+0

Gran recurso. +1 –

+0

Saludos :) ..... –

+0

Muy interesante. Estaba a punto de publicar el hallazgo similar, excepto que realmente no sabía la causa raíz de este comportamiento anormal. –

1

Puede solucionar el error de JVM utilizando Integer.MAX_VALUE-1.

Cuestiones relacionadas