JLS'ye göre, bir int
dizi başlatıldıktan hemen sonra sıfırlarla doldurulmalıdır. Ancak olmadığı bir durumla karşı karşıyayım. Böyle bir davranış ilk olarak JDK 7u4'te ve sonraki tüm güncellemelerde de ortaya çıkar (64 bit uygulama kullanıyorum). Aşağıdaki kod istisna atar:
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);
}
JVM kod bloğunu derledikten sonra istisna oluşur ve -Xint
bayrakla ortaya çıkmaz . Ek olarak, Arrays.fill(...)
ifade (bu koddaki diğer tüm ifadeler gibi) gereklidir ve yoksa istisna oluşmaz. Bu olası hatanın bazı JVM optimizasyonlarıyla sınırlı olduğu açıktır. Böyle bir davranışın nedeni için herhangi bir fikriniz var mı?
Güncelleme:
Bu davranışı HotSpot 64-bit sunucu VM'de, Gentoo Linux'ta 1.7.0_04'ten 1.7.0_10'a kadar Java sürümünde, Debian Linux'ta (her iki çekirdek 3.0 sürümü) ve MacOS Lion'da görüyorum. Bu hata her zaman yukarıdaki kodla çoğaltılabilir. Bu sorunu 32 bit JDK veya Windows üzerinde test etmedim. Oracle'a zaten bir hata raporu gönderdim (hata kimliği 7196857) ve birkaç gün içinde genel Oracle hata veritabanında görünecek.
Güncelleme:
Oracle bu hatayı genel hata veritabanında yayınladı: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7196857