4

我想知道为什么这段代码在没有 Throwing 的情况下执行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 中是可能的?
4

1 回答 1

13

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

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

详细地说,JLS,第 15.17.2 节说:

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

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

(剪断)

非零有限值除以零导致有符号无穷大。符号由上述规则确定。

这就提出了一个问题,“为什么 IEEE 声明它应该是 Infinity某种错误而不是某种错误?” 这是IEEE的解释

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

当需要注意异常情况时,可以通过陷阱立即检查它们,或者在方便的时候通过状态标志检查它们。陷阱可用于停止程序,但不可恢复的情况极为罕见。简单地停止程序不是嵌入式系统或网络代理的选项。更多情况下,陷阱会记录诊断信息或替换有效结果。

标志提供可预测的控制流和速度。它们的使用要求程序员了解异常情况,但标记粘性允许程序员延迟处理异常情况,直到必要时。

于 2013-10-08T16:18:53.383 回答