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ループでinを削除すると、出力はになります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

これはJava6の既知のバグです。JITはループを誤って最適化します。最近のバージョンのJavaにはこのバグはないと思います。

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

Java 6update16は2年以上前のものです。Java 7に更新できない場合は、最新バージョンのJava 6update25に更新することをお勧めします。

ところで、Java 6は数か月以内に無料サポートを終了します(2012年12月)

于 2012-10-09T05:29:58.310 に答える
1

Integer.MAX_VALUE-1を使用すると、JVMのバグを回避できます。

于 2013-10-23T18:50:40.977 に答える