56

なぜこのコードはスローしないの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!");
        }
    }
}

何も思いつきません!

4

8 に答える 8

92

IEEE 7541.0 / 0.0は、Infinityおよび-1.0 / 0.0-Infinityおよび0.0 / 0.0NaNとして定義されています。

ちなみに、浮動小数点値にもが-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");
于 2013-01-03T11:27:35.677 に答える
28

自分でチェックして、それが必要な場合は例外をスローできないのはなぜですか。

    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!");
    }
于 2013-01-03T11:36:09.743 に答える
25

これは、浮動小数点数を扱っているためです。ゼロによる除算は、(数値ではなく)Infinityと同様のを返しますNaN

これを防ぎたい場合は、tab[i]使用する前にテストする必要があります。次に、本当に必要な場合は、独自の例外をスローできます。

于 2013-01-03T11:25:57.840 に答える
12

0.0は二重リテラルであり、これは絶対零度とは見なされません。ほぼ無限大を表す値を保持するのに十分な大きさのdouble変数と見なされるため、例外はありません。

于 2013-01-03T11:25:57.460 に答える
10

フロートゼロで除算しても、Javaは例外をスローしません。実行時エラーは、ダブルゼロではなく整数ゼロで除算した場合にのみ検出されます。

0.0で割ると、結果はINFINITYになります。

于 2015-11-19T08:34:39.803 に答える
7

ゼロ除算の場合

  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

于 2017-10-01T10:55:49.760 に答える
3

トリックがあります。算術例外は、整数で遊んでいるとき、および/または%演算中にのみ発生します。

算術演算に浮動小数点数がある場合、内部的にすべての整数が浮動小数点に変換されます。これは、物事を簡単に覚えるのに役立つ場合があります。

于 2018-11-15T18:19:59.890 に答える
0

これは、仕様による浮動小数点演算の動作です。仕様からの抜粋、§15.17.2。除算演算子/

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

于 2019-11-25T06:34:46.393 に答える