为什么将Double.NaN转换为int不会在Java中引发异常?
因此,我知道IEEE 754为不是实数的值指定了一些特殊的浮点值。在Java中,铸造这些值的原始int
不会
抛出异常像我本来期望。相反,我们有以下内容:
int n;n = (int)Double.NaN; // n == 0
n = (int)Double.POSITIVE_INFINITY; // n == Integer.MAX_VALUE
n = (int)Double.NEGATIVE_INFINITY; // n == Integer.MIN_VALUE
在这些情况下 抛出异常的理由是什么?这是IEEE标准,还是Java设计者的选择?我是否不知道有这样的强制转换是否可能导致异常后果?
回答:
在这些情况下不抛出异常的理由是什么?
我认为原因包括:
这些都是极端情况,在执行此类操作的应用程序中很少会发生。
该行为不是“完全意外”。
当应用程序从double转换为int时,预计会丢失大量信息。该应用程序要么将忽略这种可能性,要么在强制转换之前进行检查以防止出现这种情况……这也可以检查这些情况。
没有其他的double / float操作会导致异常,在这种情况下(IMO)这样做会有点精神分裂。
在某些硬件平台上(当前或将来)可能会导致性能下降。
评论员这样说:
“我怀疑不让转换引发异常的决定是出于强烈的愿望,因为出于某种原因避免了引发异常,因为担心会迫使代码将其添加到throws子句中。”
我认为这不是一个合理的解释:
Java语言设计者1没有避免“由于任何原因”引发异常的心态。Java API中有许多示例说明了这一点。
该问题
throws
子句通过将异常未经检查的处理。实际上,由于这个原因,许多相关的异常(例如ArithmeticException
或)ClassCastException
被声明为未检查。
这是IEEE标准,还是Java设计者的选择?
我认为是后者。
我是否不知道有这样的强制转换是否可能导致异常后果?
除了显而易见的…
(但这并不真正相关。JLS和JVM规范说明了他们所说的话,更改它们可能会破坏现有代码。而且,我们讨论的不仅仅是Java代码…)
我做了一些挖掘。许多可以使用的x86指令从双精度转换为整数似乎会产生硬件中断……除非被屏蔽。(对我而言)尚不清楚指定的Java行为是否比OP建议的替代方案更容易或更难实现。
1-我毫不怀疑某些Java程序员 确实是这样 认为的。但是他们不是Java设计人员,这个问题专门询问Java设计原理。
以上是 为什么将Double.NaN转换为int不会在Java中引发异常? 的全部内容, 来源链接: utcz.com/qa/412624.html