Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么在Java算术中,溢出或下溢永远不会引发异常?_Java_.net_Integer Overflow - Fatal编程技术网

为什么在Java算术中,溢出或下溢永远不会引发异常?

为什么在Java算术中,溢出或下溢永远不会引发异常?,java,.net,integer-overflow,Java,.net,Integer Overflow,在Java算术运算期间,JVM不会抛出下溢或溢出异常。很多时候,我们都会遇到意想不到的结果,不知道出了什么问题 而对于.NET技术,我们有溢出和未流异常 所以我的问题是,为什么Java在最初创建Java时在算术运算时不抛出这个异常,语言设计者就是这样做的。我不知道为什么,但如果它有,它肯定会在引发异常时受到性能惩罚 “语言设计者的教训是,减少无声溢出的可能性可能是值得的。 这可以通过提供对不会自动溢出的算术的支持来实现 可以抛出异常而不是像Ada一样溢出,或者可以切换到更大的异常 内部表示会根据

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

而对于.NET技术,我们有溢出和未流异常


所以我的问题是,为什么Java在最初创建Java时在算术运算时不抛出这个异常,语言设计者就是这样做的。我不知道为什么,但如果它有,它肯定会在引发异常时受到性能惩罚

“语言设计者的教训是,减少无声溢出的可能性可能是值得的。 这可以通过提供对不会自动溢出的算术的支持来实现 可以抛出异常而不是像Ada一样溢出,或者可以切换到更大的异常 内部表示会根据需要自动进行,以避免溢出,Lisp也是如此 方法可能会有与之相关的性能损失 静默溢出的可能性在于支持目标类型,但这会给 类型系统[Modula-3 1.4.8]。”


礼貌-Joshua Bloch&Neal Gafter的《Java谜题陷阱和陷阱》

正如IndowKnight所说,这可能与性能有关。Java提供了处理溢出的工具,因此如果需要检测溢出,您可以这样做。您还有long和biginger,可以使用它们来避免int溢出

您应该从stackoverflow中的一个类似问题中看到这个答案。
基于汇编语言的C++语言。在这些语言中都没有抛出异常,部分原因是在设计算术运算时,这些语言中没有异常

首先使用较大的类型,如
long
double
biginger
BigDecimal
,要安全得多,如果您确实确定这样做不合适,则只使用较小的类型


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

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

  • Java之前的大型语言使用未经检查的算术。易于出现数值溢出的著名算法倾向于在不依赖校验算法的情况下考虑潜在溢出
  • 检查算法在大量使用算术指令的算法中引入了大量开销,这将使Java处于严重的劣势,尤其是在基准测试中
  • 一些算法依赖于无声的数值溢出/下溢。如果检查算术运算,重写这些算法很快就会变得非常重要
  • 检查算法对于确保内存安全不是必需的(与空指针和数组边界等其他JVM检查相反)

  • NET虚拟执行环境(现在是ECMA-335标准的一部分)为检查和未检查的算术引入了单独的指令,允许它独立地解决使用现代托管语言的开发人员的性能和安全问题。

    其他阅读材料:但我还是添加了一些有用的答案。我很感激你的建议,但我认为不应该投反对票。你能提供一个更长的引文吗?没问题,我在回答中补充道:)+1相关信息。老实说,它是否是实际的答案应该由OP决定:)当抛出溢出时,程序集确实放置了一个溢出标志。