开发者社区> 问答> 正文

Java:int数组使用非零元素初始化

根据JLS,int数组应在初始化后立即用零填充。但是,我面临的情况并非如此。这种行为首先在JDK 7u4中发生,并且在以后的所有更新中也发生(我使用64位实现)。以下代码引发异常:

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执行代码块的编译之后发生,并且不会出现带有-Xint标志的异常。此外,该Arrays.fill(...)语句(与该代码中的所有其他语句一样)是必需的,并且如果不存在该异常,则不会发生。显然,此可能的错误与JVM优化有关。对于这种行为有什么想法吗?

更新: 我在HotSpot 64位服务器VM,从Gentoo Linux,Debian Linux(均为内核3.0版本)和MacOS Lion的Java版本从1.7.0_04到1.7.0_10上看到了此行为。始终可以使用上面的代码重现此错误。我没有在32位JDK或Windows上测试此问题。我已经向Oracle发送了一个错误报告(错误ID 7196857),几天后它将出现在公共Oracle错误数据库中。

问题来源于stack overflow

展开
收起
保持可爱mmm 2020-02-07 01:24:40 810 0
1 条回答
写回答
取消 提交回答
  • 我对您的代码进行了一些更改。这不是整数溢出的问题。参见代码,它在运行时引发异常

    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));
            }
        }
        for (int ii = 0, len = a.length; ii < len; ii++)
            a[ii] = 0;
        for (int j = 0; j < a.length; ++j)
            a[j] = Integer.MAX_VALUE - 1;
        for (int j = 0; j < a.length; ++j)
            n++;
    }
    
    2020-02-07 01:24:58
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载