因此,我知道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); 将我的异常类定义为: