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

时间:2013-01-03 11:25:08

标签: java arithmeticexception

为什么此代码不会抛出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!");
        }
    }
}

我不知道!

8 个答案:

答案 0 :(得分:62)

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

BTW浮点数也有-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");

答案 1 :(得分:19)

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

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

答案 2 :(得分:17)

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

如果您想阻止这种情况,则必须先测试tab[i]才能使用它。如果你真的需要它,那么你可以抛出自己的异常。

答案 3 :(得分:10)

0.0是双字面值,这不被视为绝对零!没有例外,因为它被认为是足够大的双变量来保存代表无穷大的值!

答案 4 :(得分:6)

如果除以float 0,Java不会抛出异常。只有当你除以整数零而不是双零时,它才会检测到运行时错误。

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

答案 5 :(得分:2)

除以零

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

    public class MyBroadCastRecieverInternet extends BroadcastReceiver {
    
        public void onReceive(final Context context, Intent intent) {
            Log.d("MyLog","Internet Reciever is on");
        }
    
    }
    

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

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

    Infinity

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

答案 6 :(得分:1)

有一个窍门,算术异常仅在您使用整数时才发生,并且仅在/或%运算期间发生。

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

答案 7 :(得分:0)

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

  

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