当前位置: 首页 > 面试题库 >

为什么将Double.NaN转换为int不会在Java中引发异常?

梁马鲁
2023-03-14
问题内容

因此,我知道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设计原理。



 类似资料:
  • 问题内容: 在Java中: 抛出。为什么?为什么在这里投降?我不知道原因。 问题答案: 让我重命名您的班级,以使事情更加清楚。 -> 。 -> 。 仅仅因为你是一个人并不意味着你是一个人。你可能是一个。这就是将A强制转换为A的原因。 另一方面,每个是吗?答案是“是”。这就是为什么您 可以 编写如下代码: 要么 另外值得注意的是,您 可以 执行以下操作: 这样做的原因是您的变量实际上是在引用实例。因

  • 问题内容: Java中的所有数字都应为int类型。以下行在Java> 1.5中是合法的 同样的机制去和实例。但是龙的作品完全不同。以下代码给出了编译时错误 Long对长类型使用自动装箱方法,因此 我看不到为什么不能将int赋给Long变量。关于这个问题有什么想法吗? 问题答案: 我认为问题不在于泛型转换原语和包装。问题是关于将int转换为java.lang.Long和将int转换为java.lan

  • 问题内容: 我想知道为什么在引用“ w”之后会引发错误。您不是通过说obj = w来创建另一个指向该w实例的指针吗?也就是说,为什么与说谢谢一样呢? 问题答案: 没有什么比早上引用JLS更重要。 JLS 6.3。宣言的范围: 块中的局部变量声明的范围(第14.4节)是该声明在其中出现的其余部分,从其自身的初始化程序开始,并在局部变量声明语句的右侧包括其他任何声明符。 和 JLS 14.2 方块:

  • 问题内容: 下面是一个代码片段, 但是我得到的是空输出。 我将得到1作为输出。 有人可以解释吗?如果我想像第一个代码片段一样将int转换为char,该怎么办? 问题答案: 会打印出ascii值为1的字符(首字符,这是不可打印的)。 将以ascii值49输出一个字符(一个对应于“ 1”) 如果要转换数字(0-9),则可以将数字加48并进行转换,例如;。 如果要转换 as asi的ascii值,可以使

  • 下面是一段代码片段, 但我得到的是空输出。 我将得到1作为输出。 有人能解释一下吗?如果我想像第一个代码片段那样将int转换成char,我应该怎么做?

  • 为什么我不能在Mammal对象中抛出异常,并在创建该对象的Test类中捕获它? 我试图捕获由teDamage方法抛出的异常,但我得到:异常TakeDamageException永远不会抛出在相应的try语句的正文中 和:未报告的异常TakeDamageException;必须被捕获或声明为抛出mammal.take损害(-123); 将我的异常类定义为: