【问题标题】:Java division by zero doesnt throw an ArithmeticException - why?Java 除以零不会引发 ArithmeticException - 为什么?
【发布时间】:2012-12-17 18:15:52
【问题描述】:

为什么这段代码不抛出ArithmeticException?看看:

public class NewClass {

    public static void main(String[] args) {
        // TODO code application logic here
        double tab[] = {1.2, 3.4, 0.0, 5.6};

        try {
            for (int i = 0; i < tab.length; i++) {
                tab[i] = 1.0 / tab[i];
            }
        } catch (ArithmeticException ae) {
            System.out.println("ArithmeticException occured!");
        }
    }
}

我不知道!

【问题讨论】:

  • 那么如何更改我的代码以获得 ArithmeticException? (我不想将数组的类型更改为 int)?
  • if (tab[i] == 0) throw new ArithmeticException();.
  • 凯蒂,你想多了。 :) assylias 解决方案很好。如果出于某种原因,您不想抛出 ArithmeticException,只需抛出您想要的异常即可。
  • 使用== 检查浮点值可能容易出错。您应该始终检查足够小的数字,以排除舍入错误。

标签: java arithmeticexception


【解决方案1】:

0.0 是一个双字面值,这不被视为绝对零!也不例外,因为它被认为是双变量大到足以容纳表示接近无穷大的值!

【讨论】:

  • 不,0.0 确实是 0,IEEE 浮点规范将结果定义为一个特殊值“正无穷大”,而不仅仅是一个非常大的值。
【解决方案2】:

那是因为您正在处理浮点数。除以零返回Infinity,类似于NaN(不是数字)。

如果你想防止这种情况,你必须在使用之前测试tab[i]。然后你可以抛出你自己的异常,如果你真的需要它。

【讨论】:

    【解决方案3】:

    IEEE 7541.0 / 0.0 定义为 Infinity,将 -1.0 / 0.0 定义为 -Infinity,将 0.0 / 0.0 定义为 NaN。

    顺便说一下,浮点值也有-0.0,所以1.0/ -0.0-Infinity

    整数运算没有这些值,而是抛出异常。

    要检查可能产生非有限数的所有可能值(例如 NaN、0.0、-0.0),您可以执行以下操作。

    if (Math.abs(tab[i] = 1 / tab[i]) < Double.POSITIVE_INFINITY)
       throw new ArithmeticException("Not finite");
    

    【讨论】:

    • PeterLawrey:那么如何更改我的代码以获得 ArithmeticException? (我不想将数组的类型更改为 int)
    • @Katie 你可以在tab[i] = 1.0 / tab[i];之前查看if(tab[i] == 0.0){throw new ArithmeticException();}
    • 顺便说一句 0.0 == -0.0 所以你不必检查两个值。
    • 建议的编辑队列已满,因此这里有一个未损坏的 IEEE 754 链接ieeexplore.ieee.org/document/30711
    • 要检查所有特殊值(即 NaN、Infinity、-Infinity),请使用 if (! Double.isFinite(d))
    【解决方案4】:

    你为什么不能自己检查一下,如果你想要的话就抛出一个异常。

        try {
            for (int i = 0; i < tab.length; i++) {
                tab[i] = 1.0 / tab[i];
    
                if (tab[i] == Double.POSITIVE_INFINITY ||
                        tab[i] == Double.NEGATIVE_INFINITY)
                    throw new ArithmeticException();
            }
        } catch (ArithmeticException ae) {
            System.out.println("ArithmeticException occured!");
        }
    

    【讨论】:

    • 您还需要检查 Double.isNaN()。
    • 这不能回答问题。
    • 男人问他为什么没有报错,他没有问我该怎么做。
    【解决方案5】:

    如果除以浮点零,Java 不会抛出异常。只有当您除以 integer 零而不是双零时,它才会检测到运行时错误。

    如果除以 0.0,结果将是 INFINITY。

    【讨论】:

      【解决方案6】:

      除以零时

      1. 如果你将 double 除以 0,JVM 将显示 Infinity

        public static void main(String [] args){ double a=10.00; System.out.println(a/0); }
        

        控制台: Infinity

      2. 如果将 int 除以 0,则 JVM 将抛出 算术异常

        public static void main(String [] args){
            int a=10;
            System.out.println(a/0);
        }
        

        控制台:Exception in thread "main" java.lang.ArithmeticException: / by zero

      【讨论】:

      • NaN 不是无穷大 :)
      • @San4musa 仅适用于0/0
      【解决方案7】:

      有一个技巧,算术异常只会在你玩整数时发生,并且仅在 / 或 % 操作期间发生。

      如果算术运算中有任何浮点数,则内部所有整数都将转换为浮点数。这可以帮助您轻松记住事情。

      【讨论】:

        【解决方案8】:

        这是浮点运算的行为是规范的。规范摘录,§ 15.17.2. Division Operator /

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-01-05
          • 1970-01-01
          • 2015-10-28
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多