为什么这里的除以零操作没有触发异常?

15

(这是一个关于为什么这个异常没有被打印?为什么它显示错误的跟进问题)

在下面的代码中,为什么ArithmeticException没有被触发?

class Exp
{
    public static void main(String args[])
    {
        float d,a=1;
        try
        {
            d=0;
            a=44/d; //no exception triggered here.. why?
            System.out.print("It's not gonna print: a="+a); 
        }
        catch(ArithmeticException e)
        {
            System.out.println("Print exception: "+e);
        }
    }
} 

然而实际输出结果为:

It's not gonna print: a=Infinity

发生了什么?

2个回答

27

在整数值中,除以零会抛出异常,但在浮点值中不会。这在JLS #15.17.2中有定义:

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

  • 非零有限值除以零的结果为有符号无穷大。符号是根据上述规则确定的。

如果将ad的类型更改为int,则会得到一个异常。


7

由于根据JLS规定,除以零只适用于整数而不是浮点数

因此你会得到如下输出:

Its not gonna printed a=Infinity

由于这是计算为无限大,如果您想看到异常,只需更改

a=44/d;

转化为:

a=44/0;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接