为什么在Java算术中,溢出或下溢永远不会引发异常?
在Java算术运算期间,JVM不会抛出下溢或溢出异常。很多时候,我们都会遇到意想不到的结果,不知道出了什么问题 而对于.NET技术,我们有溢出和未流异常为什么在Java算术中,溢出或下溢永远不会引发异常?,java,.net,integer-overflow,Java,.net,Integer Overflow,在Java算术运算期间,JVM不会抛出下溢或溢出异常。很多时候,我们都会遇到意想不到的结果,不知道出了什么问题 而对于.NET技术,我们有溢出和未流异常 所以我的问题是,为什么Java在最初创建Java时在算术运算时不抛出这个异常,语言设计者就是这样做的。我不知道为什么,但如果它有,它肯定会在引发异常时受到性能惩罚 “语言设计者的教训是,减少无声溢出的可能性可能是值得的。 这可以通过提供对不会自动溢出的算术的支持来实现 可以抛出异常而不是像Ada一样溢出,或者可以切换到更大的异常 内部表示会根据
所以我的问题是,为什么Java在最初创建Java时在算术运算时不抛出这个异常,语言设计者就是这样做的。我不知道为什么,但如果它有,它肯定会在引发异常时受到性能惩罚 “语言设计者的教训是,减少无声溢出的可能性可能是值得的。 这可以通过提供对不会自动溢出的算术的支持来实现 可以抛出异常而不是像Ada一样溢出,或者可以切换到更大的异常 内部表示会根据需要自动进行,以避免溢出,Lisp也是如此 方法可能会有与之相关的性能损失 静默溢出的可能性在于支持目标类型,但这会给 类型系统[Modula-3 1.4.8]。”
礼貌-Joshua Bloch&Neal Gafter的《Java谜题陷阱和陷阱》正如IndowKnight所说,这可能与性能有关。Java提供了处理溢出的工具,因此如果需要检测溢出,您可以这样做。您还有long和biginger,可以使用它们来避免int溢出 您应该从stackoverflow中的一个类似问题中看到这个答案。
long
或double
或biginger
或BigDecimal
,要安全得多,如果您确实确定这样做不合适,则只使用较小的类型
如果您使用这些更广泛的类型,这不一定是一个常见问题。这可能是多种因素的组合:
NET虚拟执行环境(现在是ECMA-335标准的一部分)为检查和未检查的算术引入了单独的指令,允许它独立地解决使用现代托管语言的开发人员的性能和安全问题。其他阅读材料:但我还是添加了一些有用的答案。我很感激你的建议,但我认为不应该投反对票。你能提供一个更长的引文吗?没问题,我在回答中补充道:)+1相关信息。老实说,它是否是实际的答案应该由OP决定:)当抛出溢出时,程序集确实放置了一个溢出标志。