Según el JLS, una int
matriz debe rellenarse con ceros justo después de la inicialización. Sin embargo, me enfrento a una situación en la que no es así. Tal comportamiento ocurre primero en JDK 7u4 y también ocurre en todas las actualizaciones posteriores (uso la implementación de 64 bits). El siguiente código arroja una excepción:
public static void main(String[] args) {
int[] a;
int n = 0;
for (int i = 0; i < 100000000; ++i) {
a = new int[10];
for (int f : a)
if (f != 0)
throw new RuntimeException("Array just after allocation: "+ Arrays.toString(a));
Arrays.fill(a, 0);
for (int j = 0; j < a.length; ++j)
a[j] = (n - j)*i;
for (int f : a)
n += f;
}
System.out.println(n);
}
La excepción ocurre después de que la JVM realiza la compilación del bloque de código y no surge con el -Xint
indicador. Además, la Arrays.fill(...)
declaración (como todas las demás declaraciones en este código) es necesaria, y la excepción no ocurre si está ausente. Está claro que este posible error está limitado con alguna optimización de JVM. ¿Alguna idea por la razón de tal comportamiento?
Actualización:
veo este comportamiento en la máquina virtual del servidor HotSpot de 64 bits, la versión Java de 1.7.0_04 a 1.7.0_10 en Gentoo Linux, Debian Linux (versión del kernel 3.0) y MacOS Lion. Este error siempre se puede reproducir con el código anterior. No probé este problema con un JDK de 32 bits o en Windows. Ya envié un informe de error a Oracle (ID de error 7196857) y aparecerá en la base de datos pública de errores de Oracle en unos días.
Actualización:
Oracle publicó este error en su base de datos pública de errores: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7196857