Java被零除不会抛出ArithmeticException -为什么?

zsohkypk  于 2023-05-21  发布在  Java
关注(0)|答案(8)|浏览(96)

为什么这段代码没有抛出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!");
        }
    }
}
wi3ka0sx

wi3ka0sx1#

IEEE 7541.0 / 0.0定义为Infinity,将-1.0 / 0.0定义为-Infinity,将0.0 / 0.0定义为NaN。
顺便说一下,浮点值也有-0.0,所以1.0/ -0.0-Infinity
整数算术没有这些值中的任何一个,而是抛出一个Exception。
检查所有可能的值(例如NaN,0.0,-0.0),这可能会产生一个非有限数,您可以执行以下操作。

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

5n0oy7gb2#

为什么你不能自己检查它,然后抛出一个异常,如果这是你想要的。

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!");
    }
2q5ifsrm

2q5ifsrm3#

这是因为你正在处理浮点数。除以零返回Infinity,类似于NaN(不是数字)。
如果你想防止这种情况,你必须在使用它之前测试tab[i]。如果你真的需要的话,你可以抛出你自己的异常。

uqjltbpv

uqjltbpv4#

0.0是一个双精度文本,这不被认为是绝对零!没有例外,因为它被认为是双变量大到足以容纳代表接近无穷大的值!

xwmevbvl

xwmevbvl5#

Java不会抛出一个异常,如果你除以浮点数0。只有当你除以integer零而不是双零时,它才能检测到运行时错误。
如果除以0.0,结果将是无穷大。

lnlaulya

lnlaulya6#

除以零

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

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

控制台:Infinity
1.如果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

qgzx9mmu

qgzx9mmu7#

有一个技巧,算术异常只发生在你玩整数的时候,并且只发生在/或%操作期间。
如果算术运算中有任何浮点数,则内部所有整数都将转换为浮点数。这可以帮助你更容易地记住事情。

8wtpewkr

8wtpewkr8#

这是浮点运算的行为规范。摘自规范,§ 15.17.2。部门操作员/:
一个非零的有限值除以零得到一个有符号的无穷大。符号由上述规则确定。

相关问题