我已经了解到(至少在 java 中)整数/长值无提示溢出,并且它们的值从溢出时的最小值开始,而不是抛出任何异常。
我正在使用外部 api 进行一些文件操作,其中最大文件大小是从属性文件加载的。在我的本地测试环境中一切都很好。代码进入实时环境后,最大文件大小限制根本不起作用。经过两天的调试/分析代码,根本没有成功。然后由于其他一些原因,我使用了实时的 constants.properties 文件并用它调试了代码。o_0
我只想问,是什么阻止他们在溢出时抛出异常?
我已经了解到(至少在 java 中)整数/长值无提示溢出,并且它们的值从溢出时的最小值开始,而不是抛出任何异常。
我正在使用外部 api 进行一些文件操作,其中最大文件大小是从属性文件加载的。在我的本地测试环境中一切都很好。代码进入实时环境后,最大文件大小限制根本不起作用。经过两天的调试/分析代码,根本没有成功。然后由于其他一些原因,我使用了实时的 constants.properties 文件并用它调试了代码。o_0
我只想问,是什么阻止他们在溢出时抛出异常?
在许多情况下,Java 基于 C 或 C++,而这些基于 Assembly。溢出/下溢在 C 和 C++ 中是无声的,而在汇编中几乎是无声的(除非您检查特殊标志)。这可能是因为 C 和 C++ 在首次提出时没有例外。如果您想查看溢出/下溢,您只需使用更大的类型。例如long long int
或long double
;) BTW 程序集有类似于称为陷阱或中断的异常,溢出/下溢不会导致陷阱 AFAIK。
我喜欢做的是使用long
,double
除非我确定这些类型比需要的大得多。您不能拥有long
尺寸溢出的设备。
原因是“因为 Java 语言规范是这么说的”。
第 4.2.2 节。JLS 的整数运算说:
整数运算符不以任何方式指示上溢或下溢。
对我来说这是有道理的,否则你需要:
两者都会使原语及其操作“不简单”,而原语的简单性是一种不值得为可预测且通常很少发生的事件而牺牲的力量。