在下面的示例代码中,我除以零,当我使用调试器单步调试它时,(被除数/除数)会产生无穷大或 NaN(如果除数为零)。当我将此结果转换为 long 时,我会得到一个有效结果,通常类似于 -9223372036854775808。为什么这个演员阵容有效?为什么它不停止执行(例如抛出异常)而不是分配任意值?
double divisor = 0;
double dividend = 7;
long result = (long)(dividend / divisor);
为什么这个演员阵容有效?
如果在编译时已知转换是有效的might成功或always成功了。仅当转换不可能成功时,强制转换才是非法的。 (例如,将密封类型转换为它未实现的接口。)从 double 到 long 的转换可能会成功。因此演员阵容是有效的。
为什么它不停止执行(例如抛出异常)而不是分配任意值?
因为你没有要求例外!该规范非常清楚预期的行为是什么。参见第 6.2.1 节:
对于从 float 或 double 到整型的转换,处理取决于发生转换的溢出检查上下文:
在已检查的上下文中,转换按如下方式进行:
• 如果操作数的值为NaN 或无穷大,则抛出System.OverflowException。
[...]
在未经检查的上下文中,转换始终会成功,并按如下方式进行。
• 如果操作数的值为NaN 或无穷大,则转换结果是目标类型的未指定值。
您正在未经检查的上下文中执行代码;你要求没有例外,所以你也没有得到例外。如果您想要例外,请申请例外;使用已检查的上下文。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)