【问题标题】:Why RuntimeException doesn't work when you divide by 0?为什么除以 0 时 RuntimeException 不起作用?
【发布时间】:2013-10-08 16:16:46
【问题描述】:

我想知道为什么这段 sn-p 代码执行时没有抛出 RuntimeException(确切地说是 ArithmethicException):

代码:

public class Proba {
    public static void main(String[] args) {
        Double d = new Double(5.0);
        try {
            d = d / 0;
        } catch (Exception e) {
            System.out.println("Error division by zero!");
        }
        System.out.println("d = " + d);
    }
}

输出:

d = Infinity

我想知道怎么可能。

我的java版本是:

C:\Documents and Settings\Admintemp>java -version
java version "1.7.0"
Java(TM) SE Runtime Environment (build 1.7.0-b147)
Java HotSpot(TM) Client VM (build 21.0-b17, mixed mode, sharing)
  • 为什么这种行为在 Java 中是可能的?

【问题讨论】:

标签: java exception


【解决方案1】:

这是可能的,因为 Java 遵循 IEEE 浮点除法标准。

确实,整数除以 0 会抛出 ArithmeticException,但浮点除以 0 会产生 Infinity 的特殊浮点值。

详细说明,the JLS, Section 15.17.2 说:

[I]如果整数除法的除数为0,则抛出ArithmeticException。

浮点除法的结果由以下规则确定 IEEE 754 算法:

(截图)

一个非零有限值除以一个零会产生一个有符号的 无穷。符号由上述规则确定。

这就引出了一个问题,“为什么 IEEE 声明它应该是 Infinity 而不是某种错误?” 这是IEEE's explanation

为什么除以零(或上溢或下溢)不停止 程序或触发错误?为什么数字标准包括 “非数字”(NaN)? 754 模型鼓励强大的程序。这是 不仅适用于数值分析师,也适用于电子表格 用户、数据库系统,甚至咖啡壶。传播规则 对于 NaN 和无穷大,允许无关紧要的异常消失。 类似地,逐渐下溢在一个 精度范围。

当需要注意特殊情况时,可以对其进行检查 立即通过陷阱或在方便的时间通过状态标志。陷阱 可用于停止程序,但不可恢复的情况是 极为罕见。简单地停止程序不是一种选择 嵌入式系统或网络代理。更多时候,陷阱日志诊断 信息或替代有效结果。

标志提供可预测的控制流和速度。他们的用途 要求程序员注意异常情况,但标记 粘性允许程序员延迟处理异常情况 直到必要为止。

【讨论】:

  • 仅用于浮点数。在这种情况下整数呢?
  • 没有代表无穷大的int 值。虽然有floatdouble 表示Infinity,但没有int(或byteshortlong)的这种表示。将int 除以零作为任何其他合法、有意义的int 值进行评估是错误的。 1 除以 0 不是 Integer.MAX_VALUE 或任何其他可表示为 int 的东西。因此,Java 唯一的办法就是抛出异常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-24
  • 1970-01-01
  • 1970-01-01
  • 2020-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多