考虑以下 java 代码:
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 规范的某个地方说,持续评估不应运行功能操作?
ps: 完整的代码源+单元测试可以在这里找到:https://gist.github.com/dirtyhenry/5804130
更新:
- 我只通过 junit 运行代码。 junit 是否应对此行为负责?
更新 2:
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)
最佳答案
我在这里遇到了类似的问题:Near empty Java For-Loop acts strange 您应该尝试使用 JVM 1.7 或尝试使用 while 循环:
public int main() {
int i = 1111;
while(i < Integer.MAX_VALUE){
if (!rules(i)) {
break;
}
i++
}
System.out.println("The mystery number is: " + i);
return i;
}
关于java - 为什么我的 JVM 会进行一些运行时循环优化并使我的代码出现错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17166047/