【问题标题】:Why do integer datatypes overflow silently rather than throwing exception为什么整数数据类型会静默溢出而不是抛出异常
【发布时间】:2013-04-14 10:23:04
【问题描述】:

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

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

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

【问题讨论】:

标签: java integer long-integer integer-overflow


【解决方案1】:

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

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

【讨论】:

  • You can't have a device which overflows long in size。这句话价值一百万分,一个简单的事实,一开始并没有想到。谢谢。
  • 也许有一天会有一个 Java 文件,但文件必须超过 90 亿 GB。
  • 也许在那个时代,今天的语言应该是 IT 语言。博物馆。
  • 这些陈述很容易! ;) 还记得“640KB 应该对任何人都足够”吗? long 可以描述的文件/卷大小最多只能达到大约 9 Exa 字节。谷歌现在不仅在这个范围内运行,它也仅比当前的 4TB 硬盘高出 200 万倍。比它低 200 万倍的是我们心爱的 3.5 英寸软盘,它在 25 年前还是标准数据载体……因此,再过 25 年,来自标准相机的单个 Super-XUHD 视频可能很容易损坏你的应用程序。:) Java 也可能存活那么久...... Fortran 和 C 都有。
【解决方案2】:

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

JLS 的Section 4.2.2. Integer Operations 说:

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

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

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

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

【讨论】:

  • 嗯?为什么投反对票?这个答案如何“没有帮助”? (这个答案其实是对的)
  • +1 不幸的是,SO 社区有时不喜欢真相。
  • 问题是寻找语言以这种方式制作的原因(因此是为什么这个词),指向规范并没有提供任何推理。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-25
  • 2014-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多