当前位置: 首页 > 面试题库 >

这是JVM错误还是“预期行为”?

诸葛砚
2023-03-14
问题内容

我注意到了一些意外的行为(相对于我的个人期望而言是意外的),我想知道是否是JVM中存在错误,或者这可能是一种边缘情况,在这种情况下我不了解某些确切的细节应该发生。假设我们自己在main方法中具有以下代码

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中“翻转”,因此将1加到会Integer.MAX_VALUE导致Integer.MIN_VALUE。由于Integer.MIN_VALUE仍小于Integer.MAX_VALUE,因此循环将循环遍历负数甚至整数。最终它将回到0,并且此过程应作为无限循环重复进行。

当我实际运行此代码时,会得到不确定的结果。打印的结果往往约为50万,但实际值会有所不同。因此,当我认为循环应该是无限循环时,循环不仅终止了,而且似乎随机终止了。这是怎么回事?

我的猜测是,这要么是JVM中的错误,要么是正在进行许多时髦的优化,从而产生了预期的行为。哪有


问题答案:

已知的错误。相关

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6196102

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6357214

和别的。

我认为它们被认为是低优先级的,因为它们不在现实世界中出现。



 类似资料:
  • 问题内容: 环境:Ubuntu x86_64(14.10),Oracle JDK 1.8u25 我尝试使用的并行流,但我想要第一行(这是带有标头的CSV文件)。因此,我尝试这样做: 但是随后一列无法解析为一个整数… 所以我尝试了一些简单的代码。文件问题很简单: 代码也同样简单: 我 系统地 得到了以下结果(好的,我只运行了大约20次): 我在这里想念什么? 编辑 似乎问题或误解根源远不止于此(以下

  • 此代码为-O1和-O2提供不同的结果: 那么这是一个错误吗?或者其中是否存在某种未定义的行为,编译器有权为其提供不同的结果? 据我从C99标准中可以看出,遍历所有值的循环是有效的,因为最大无符号整数值的增量被很好地定义为导致零。 涉及无符号操作数的计算永远不会溢出,因为不能由结果无符号整数类型表示的结果将被减少为比结果类型可以表示的最大值大一的数的模。

  • 为什么当我添加一个语义谓词(虽然这里是一个虚拟谓词)作为替代选项时,它总是说“第1行:5在输入' '处没有可行的替代选项”?如果我删除带有false语义谓词的替代选项,错误就会像预期的那样消失。 PS:我使用的是antlr-4.0-complete.jar

  • 问题内容: 也许我在PHP手册中某个地方缺少它,但是错误和异常之间的区别到底是什么?我可以看到的唯一区别是错误和异常的处理方式不同。但是什么导致异常,什么导致错误? 问题答案: 引发异常 -旨在捕获异常。错误通常是无法恢复的。例如,让我们说- 您有一段代码将在数据库中插入一行。此调用有可能失败(重复ID)-您将希望遇到一个“错误”,在这种情况下为“异常”。当您插入这些行时,您可以执行以下操作 程序

  • 问题内容: 我正在尝试学习Go,但是坚持使用以下语言:http : //ideone.com/hbCamr或http://ideone.com/OvRw7t 对于此输入: 输出为: 这是预期的行为吗?为什么它不像C ++ getline一样起作用?http://ideone.com/Wx8z5o 问题答案: 答案在以下文档中: Scanln与Scan相似,但是在换行符处停止扫描,并且在最后一个项目

  • 几天前,我在java代码中输入了一个错误,但它编译后运行良好。(尽管结果很奇怪。) 我的代码是: 我无法找到为什么第二个作业没有错误,并且打印了124。(当然,“|”在ASCII码中是124。但为什么是“124”,而不是“|”?) 这是编译器错误吗?还是我还不知道的正确java语法?