Java 为什么整数数据类型以静默方式溢出,而不是引发异常

Java 为什么整数数据类型以静默方式溢出,而不是引发异常,java,integer,long-integer,integer-overflow,Java,Integer,Long Integer,Integer Overflow,我在java中了解到,整型/长型值以静默方式溢出,它们的值从溢出时的最小值开始,而不是抛出任何异常 我对一些文件操作使用了外部api,其中最大文件大小是从属性文件加载的。在我当地的测试环境中一切都很好。代码一进入实时环境,最大文件大小限制就根本不起作用。经过两天的代码调试/分析,根本没有成功。然后出于其他原因,我使用liveconstants.properties文件调试代码。o_0 我想问,是什么阻止了他们在溢出上抛出异常?< /P> < P>很多情况下,java是基于C++或C++的,这些都

我在java中了解到,整型/长型值以静默方式溢出,它们的值从溢出时的最小值开始,而不是抛出任何异常

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


我想问,是什么阻止了他们在溢出上抛出异常?< /P> < P>很多情况下,java是基于C++或C++的,这些都是基于汇编的。溢出和下溢在C和C++中是无声的,除非在检查特殊标志,否则在汇编中几乎是沉默的。这可能是因为C和C++在第一次提出时没有例外。如果您想查看溢出/下溢,只需使用较大的类型。e、 g.长整型或长双精度;顺便说一句,组件有一些类似于称为陷阱或中断的异常,溢出/下溢不会导致陷阱AFAIK


我更喜欢使用long和double,除非我确信这些类型比需要的大得多。你不能让设备长时间溢出。

原因是Java语言规范这么说的

联合联络小组的成员说:

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

对我来说这很有意义,否则你需要:

要抛出的“NumericOverflowException”,需要“try catch”,或 要在基元结果上设置的标志,这将需要对基元操作进行更复杂的处理
这两种情况都会使原语及其操作变得“不简单”,而原语的简单性是一种不值得为可预测且通常罕见的情况而牺牲的优势。

性能。在每次数学运算后检查溢出是昂贵的。每次加法或乘法都需要一个比较和一个分支。你不能有一个长时间溢出的设备。这句话值一百万分,这是一个很简单的事实,但一开始我并没有想到。谢谢。也许有一天会有一个Java版本,但文件必须超过90亿GB。也许在那个时候,今天的语言会出现在I.T.博物馆里。这类声明很简单;还记得640KB对任何人都应该足够吗?长字符只能描述文件/卷的大小,最多可达9 Exa字节。谷歌目前不仅在这一范围内运行,而且与目前的4TB硬盘相比,它也只有200万倍。比这个数字低200万倍的是我们钟爱的3.5软盘,25年前它还是标准的数据载体。。。因此,再过四分之一个世纪,一个标准相机的一个超级XUHD视频可能很容易破坏你的应用程序Java也可能存活那么久。。。Fortran和C都有,嗯?为什么要投否决票?这个答案怎么没有帮助?这个答案实际上是正确的+1不幸的是,SO社区有时不喜欢真相。问题在于语言是以这种方式编写的原因,因此指向规范的“为什么”一词没有提供任何推理。