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

时间:2013-04-14 10:23:05

标签: java integer long-integer integer-overflow

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

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

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

2 个答案:

答案 0 :(得分:5)

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

我更喜欢使用longdouble,除非我确定这些类型比需要的要大得多。您不能拥有大小为long的设备。

答案 1 :(得分:0)

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

JLS的{p> Section 4.2.2. Integer Operations说:

  

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

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

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

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