为什么,在Java算法中,溢出或下溢永远不会抛出异常?

时间:2013-04-18 14:08:43

标签: java .net integer-overflow

在Java算术运算期间,JVM不会抛出下溢或溢出异常。很多时候,我们遇到了意想不到的结果,并想知道出了什么问题。

在.NET技术的情况下,我们有溢出和解除流失的例外。

所以我的问题是,为什么Java设计不会在算术运算期间抛出此异常

4 个答案:

答案 0 :(得分:6)

这可能是多种因素的组合:

  1. Java之前的大型语言使用未经检查的算术。众所周知的容易出现数值溢出的算法往往会在不依赖于检查算术的情况下解释潜在的溢出。
  2. 经过检查的算术会在大量使用算术指令的算法中引入显着的开销,这会使Java处于严重的劣势,特别是对于基准测试。
  3. 某些算法依赖于静默数值上溢/下溢。如果检查了算术运算,重写这些算法很快就会变得非常重要。
  4. 检查算术不是确保内存安全所必需的(与其他JVM检查相反,如空指针和数组边界)。
  5. .NET虚拟执行环境(现在是ECMA-335标准的一部分)为已检查和未经检查的算法引入了单独的指令,使其能够独立解决使用现代托管语言的开发人员的性能和安全问题。

答案 1 :(得分:2)

这可能与Indoknight所说的性能有关。 Java提供了处理溢出的工具,因此如果您需要检测它,您可以执行此操作。你也有long和BigInteger,可以使用它们来避免你的int溢出。

你应该从stackoverflow中的类似问题看到这个答案。 How does Java handle integer underflows and overflows and how would you check for it?

答案 2 :(得分:1)

最初创建Java时,语言设计者就是这样做的。我不确定为什么,但如果有它肯定会在提高例外方面受到性能损失。

  

“语言设计师的教训是,值得减少无声溢出的可能性。   这可以通过为不会静默溢出的算术提供支持来完成。程式   可以抛出异常而不是溢出,就像Ada一样,或者它们可以切换到更大的异常   内部表示自动按需要避免溢出,Lisp也是如此。这两个   方法可能会对其产生性能损失。减少的另一种方法   静默溢出的可能性是支持目标类型,但这会增加显着的复杂性   类型系统[Modula-3 1.4.8]。“

礼貌--Jachua Bloch& amp; amp; amp; amp; amp; Neal Gafter

答案 3 :(得分:1)

Java基于C和C ++,它基于Assembly。在这些语言中都没有抛出异常,部分原因是在设计算术运算时,异常不在那些语言中。

首先使用较大的类型(如longdoubleBigIntegerBigDecimal更安全,如果您确定的话,只使用较小的类型这是不合适的。

如果您使用这些更宽泛的类型,则不一定是常见问题。