8

当我运行这个类时,for循环似乎提前终止

class Test {

    public static void main(String[] args) {
        int result = 0;
        int end = Integer.MAX_VALUE;
        int i;
        for (i = 1; i <= end; i += 2) {
            System.out.println(i);
        }
        System.out.println("End:" + i);
    }

}

输出是:

1
3
5
...
31173
31175
End:31177

为什么到此为止?有趣的是,如果我删除了System.out.println(i)for 循环中的 ,输出将是End:-2147483647. 显然 中的值iwrapped round

我使用的 Java 版本是

Java(TM) SE Runtime Environment (build 1.6.0_16-b01)
Java HotSpot(TM) 64-Bit Server VM (build 14.2-b01, mixed mode)
4

2 回答 2

15

它是 Java 6 中的一个已知错误。JIT 错误地优化了循环。我相信最新版本的 Java 没有这个错误。

http://vanillajava.blogspot.co.uk/2011/05/when-jit-gets-it-wrong.html

Java 6 update 16 才刚刚推出两年多。如果您无法更新到 Java 7,我建议您更新到最新版本 Java 6 update 25。

BTW Java 6 将在几个月后终止免费支持(2012 年 12 月)

于 2012-10-09T05:29:58.310 回答
1

您可以使用 Integer.MAX_VALUE-1 解决 JVM 错误。

于 2013-10-23T18:50:40.977 回答