Java:int 数组使用非零元素初始化
根据 JLS,数组应该在初始化后由零填充。但是,我面临的情况并非如此。这种行为首先发生在JDK 7u4中,也发生在所有以后的更新中(我使用64位实现)。下面的代码引发异常:int
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 执行代码块编译之后,并且不会出现带有标志的情况。此外,该语句(与此代码中的所有其他语句一样)是必需的,如果异常不存在,则不会发生异常。很明显,这个可能的错误与一些JVM优化有关。出于这种行为的原因,有什么想法吗?-Xint
Arrays.fill(...)
更新:
我在HotSpot 64位服务器VM上看到此行为,Java版本从1.7.0_04到Gentoo Linux,Debian Linux(内核3.0版本)和MacOS Lion上的1.7.0_04到1.7.0_10。此错误始终可以使用上面的代码重现。我没有用32位JDK或Windows测试这个问题。我已经向Oracle发送了一份错误报告(错误id 7196857),它将在几天内出现在公共Oracle错误数据库中。
更新:
Oracle在其公共错误数据库中发布了此错误:http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7196857