在Java算术运算期间,JVM不会抛出下溢或溢出异常。很多时候,我们遇到了意想不到的结果,并想知道出了什么问题。
在.NET技术的情况下,我们有溢出和解除流失的例外。
所以我的问题是,为什么Java设计不会在算术运算期间抛出此异常
答案 0 :(得分:6)
这可能是多种因素的组合:
.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。在这些语言中都没有抛出异常,部分原因是在设计算术运算时,异常不在那些语言中。
首先使用较大的类型(如long
或double
或BigInteger
或BigDecimal
更安全,如果您确定的话,只使用较小的类型这是不合适的。
如果您使用这些更宽泛的类型,则不一定是常见问题。