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

何が起こるのですか?

4

2 に答える 2

27

ゼロによる除算は整数値の例外をスローしますが、浮動小数点値の例外はスローしません。これはJLS#15.17.2で定義されています:

浮動小数点除算の結果は、IEEE754算術の規則によって決定されます。
[...]

  • ゼロ以外の有限値をゼロで除算すると、符号付きの無限大になります。符号は上記のルールで決まります。

aとのタイプをに変更するdint、例外が発生します。

于 2012-08-26T14:13:13.573 に答える
7

JLSのように浮動小数点数ではなく、整数にDivide by zero適用されるため

そして、あなたは次のように出力を得るでしょう

Its not gonna printed a=Infinity

これは次のように計算されるためInfinity

そして、あなたが例外を見たい場合はただ変更してください

a=44/d;

これに

a=44/0;
于 2012-08-26T14:14:45.990 に答える