for循环在与Integer.MAX_VALUE和使用System.out.println进行比较时提前终止

时间:2012-10-09 05:19:03

标签: java for-loop int max

当我运行这个类时,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

为什么它会在那里结束?有趣的是,如果我删除了for循环中的System.out.println(i),则输出将为End:-2147483647。显然,i中的值有wrapped 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)

2 个答案:

答案 0 :(得分:15)

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

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

Java 6更新16刚刚超过两年。如果您无法更新到Java 7,我建议您更新到最新版本的Java 6更新版本。

BTW Java 6将在几个月内完成免费支持(2012年12月)

答案 1 :(得分:1)

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