Theo JLS, một int
mảng nên được điền bởi các số 0 ngay sau khi khởi tạo. Tuy nhiên, tôi phải đối mặt với một tình huống mà nó không phải là. Một hành vi như vậy xảy ra đầu tiên trong JDK 7u4 và cũng xảy ra trong tất cả các bản cập nhật sau này (tôi sử dụng triển khai 64 bit). Đoạn mã sau ném ngoại lệ:
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);
}
Ngoại lệ xảy ra sau khi JVM thực hiện biên dịch khối mã và không phát sinh với -Xint
cờ. Ngoài ra, Arrays.fill(...)
câu lệnh (như tất cả các câu lệnh khác trong mã này) là cần thiết và ngoại lệ không xảy ra nếu nó không có. Rõ ràng là lỗi có thể này bị ràng buộc với một số tối ưu hóa JVM. Bất kỳ ý tưởng cho lý do của một hành vi như vậy?
Cập nhật:
Tôi thấy hành vi này trên máy chủ HotSpot 64 bit, phiên bản Java từ 1.7.0_04 đến 1.7.0_10 trên Gentoo Linux, Debian Linux (cả phiên bản kernel 3.0) và MacOS Lion. Lỗi này luôn có thể được sao chép với mã ở trên. Tôi đã không kiểm tra vấn đề này với JDK 32 bit hoặc trên Windows. Tôi đã gửi báo cáo lỗi tới Oracle (id lỗi 7196857) và nó sẽ xuất hiện trong cơ sở dữ liệu lỗi công khai của Oracle sau vài ngày.
Cập nhật:
Oracle đã xuất bản lỗi này tại cơ sở dữ liệu lỗi công khai của họ: http://bugs.sun.com/bugdatabase/view_orms.do?bug_id=7196857