Consider the following java code:
public int main() {
int i = 1111;
for (; rules(i) != true && i < Integer.MAX_VALUE; i++) {
//LOG.debug("Testing i: " + i);
}
System.out.println("The mystery number is: " + i);
return i;
}
protected boolean rules(int nb) {
//...
}
我发现即使for循环继续评估为
true
,当其主体为空时,循环也会停止执行。
main
的最终结果是错误的(i
在98%的时间内为16698,有时会稍微高一些/低一些)。
如果我取消循环主体中的LOG语句,循环将一直运行,直到循环继续评估为false
。我使用的JVM是MacOS X VM 1.6.0。
- 它是否正在进行某种运行时优化?
- 这种运行时优化是否可以视为错误?
- 还是Java规范中说for继续评估不应运行功能操作?
- 我只通过junit运行了代码。junit是否对此行为负责?
java -version
返回值:
java version "1.6.0_51"
Java(TM) SE Runtime Environment (build 1.6.0_51-b11-456-11M4508)
Java HotSpot(TM) 64-Bit Server VM (build 20.51-b01-456, mixed mode)
int
切换到long
。也许存在静默值溢出的情况。 - spasint
切换到long
并保持循环为空时,我得到了正确的结果。虽然有点奇怪,因为 16698 远远小于 Java 中 int 的最大值(2147483647,请参见 http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html)。 - Dirty Henry