为什么将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

回到顶部