6

我已经了解到(至少在 java 中)整数/长值无提示溢出,并且它们的值从溢出时的最小值开始,而不是抛出任何异常。

我正在使用外部 api 进行一些文件操作,其中最大文件大小是从属性文件加载的。在我的本地测试环境中一切都很好。代码进入实时环境后,最大文件大小限制根本不起作用。经过两天的调试/分析代码,根本没有成功。然后由于其他一些原因,我使用了实时的 constants.properties 文件并用它调试了代码。o_0

我只想问,是什么阻止他们在溢出时抛出异常?

4

2 回答 2

5

在许多情况下,Java 基于 C 或 C++,而这些基于 Assembly。溢出/下溢在 C 和 C++ 中是无声的,而在汇编中几乎是无声的(除非您检查特殊标志)。这可能是因为 C 和 C++ 在首次提出时没有例外。如果您想查看溢出/下溢,您只需使用更大的类型。例如long long intlong double;) BTW 程序集有类似于称为陷阱或中断的异常,溢出/下溢不会导致陷阱 AFAIK。

我喜欢做的是使用longdouble除非我确定这些类型比需要的大得多。您不能拥有long尺寸溢出的设备。

于 2013-04-14T10:26:01.753 回答
0

原因是“因为 Java 语言规范是这么说的”。

第 4.2.2 节。JLS 的整数运算说:

整数运算符不以任何方式指示上溢或下溢。

对我来说这是有道理的,否则你需要:

  • 要抛出一个“NumericOverflowException”,这需要一个“try catch”,或者
  • 要在原始结果上设置的标志,这将需要对原始操作进行更复杂的处理

两者都会使原语及其操作“不简单”,而原语的简单性是一种不值得为可预测且通常很少发生的事件而牺牲的力量。

于 2013-04-14T10:37:01.603 回答