Menurut JLS, int
array harus diisi dengan nol setelah inisialisasi. Namun, saya dihadapkan pada situasi di mana tidak. Perilaku seperti itu terjadi pertama kali di JDK 7u4 dan juga terjadi di semua pembaruan selanjutnya (saya menggunakan implementasi 64-bit). Kode berikut melempar pengecualian:
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);
}
Pengecualian terjadi setelah JVM melakukan kompilasi blok kode dan tidak muncul dengan -Xint
flag. Selain itu, Arrays.fill(...)
pernyataan (karena semua pernyataan lain dalam kode ini) diperlukan, dan pengecualian tidak terjadi jika tidak ada. Jelas bahwa kemungkinan bug ini terikat dengan beberapa optimasi JVM. Adakah ide untuk alasan perilaku seperti itu?
Memperbarui:
Saya melihat perilaku ini pada HotSpot 64-bit server VM, versi Java dari 1.7.0_04 ke 1.7.0_10 pada Gentoo Linux, Debian Linux (keduanya versi kernel 3.0) dan MacOS Lion. Kesalahan ini selalu dapat direproduksi dengan kode di atas. Saya tidak menguji masalah ini dengan JDK 32-bit atau pada Windows. Saya sudah mengirim laporan bug ke Oracle (bug id 7196857) dan akan muncul di database bug Oracle publik dalam beberapa hari.
Pembaruan:
Oracle menerbitkan bug ini di database bug publik mereka: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7196857