我注意到了一些意想不到的行爲(與我個人的預期相關),並且我想知道如果JVM中存在某個錯誤,或者這是一個附帶案例,我不理解其中的一些細節究竟應該發生什麼。假設我們本身有一個主要方法如下代碼:這是JVM錯誤還是「預期行爲」?
int i;
int count = 0;
for(i=0; i < Integer.MAX_VALUE; i+=2){
count++;
}
System.out.println(i++);
一個天真的預期是,這將打印Integer.MAX_VALUE-1
,最大的甚至可表示int
。但是,我相信整數算術應該在Java中「翻轉」,所以在Integer.MAX_VALUE
中加1應該會導致Integer.MIN_VALUE
。由於Integer.MIN_VALUE
仍然小於Integer.MAX_VALUE
,因此循環將不斷迭代負整數。最終它會回到0,這個過程應該重複爲一個無限循環。
當我實際運行此代碼時,我得到了非確定性結果。打印出來的結果往往是五十萬左右,但確切的數值會有所不同。因此,不僅當循環終止時,我認爲它應該是一個無限循環,但它似乎隨機終止。這是怎麼回事?
我的猜測是,這可能是JVM中的一個錯誤,或者有很多時髦的優化會導致這種預期的行爲。這是什麼?
這是所有在你的主要方法? – 2011-03-03 16:23:42
是的......這很重要嗎? – 2011-03-03 16:24:26
@Michael:只要檢查一下是否有一些時髦的線程正在進行。在我的機器上總是打印出2147483640,但這仍然是意想不到的。 – 2011-03-03 16:26:13