为什么整数数据类型以静默方式溢出而不是抛出exception

我已经学会了(至少在java中)整数/长值静默地溢出,它们的值从溢出时的最小值开始而不是抛出任何exception。

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

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

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

我喜欢做的是使用longdouble除非我确定这些类型比需要的大得多。 你不能拥有一个长度溢出的设备。

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

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

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

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

  • 要抛出的’NumericOverflowException’,需要’try catch’,或者
  • 要在原始结果上设置的标志,这将需要更复杂的原始操作处理

这两者都会使原语和它们的操作“不简单”,并且原始的简单性是一种不值得为可预测且通常很少发生的牺牲的强度。