4

このコード スニペットがスローなしで実行された理由RuntimeException(正確にはArithmethicException )を知りたいと思っています。

コード:

public class Proba {
    public static void main(String[] args) {
        Double d = new Double(5.0);
        try {
            d = d / 0;
        } catch (Exception e) {
            System.out.println("Error division by zero!");
        }
        System.out.println("d = " + d);
    }
}

出力:

d = Infinity

それがどのように可能か知りたいです。

私のJavaバージョンは次のとおりです。

C:\Documents and Settings\Admintemp>java -version
java version "1.7.0"
Java(TM) SE Runtime Environment (build 1.7.0-b147)
Java HotSpot(TM) Client VM (build 21.0-b17, mixed mode, sharing)
  • Javaでこの動作が可能なのはなぜですか?
4

1 に答える 1

13

これは、Java が浮動小数点除算の IEEE 標準に準拠しているため可能です。

整数を 0 で除算すると がスローされるのは事実ですArithmeticExceptionが、浮動小数点を 0 で除算すると の特別な浮動小数点値が生成されInfinityます。

詳しく説明すると、JLS のセクション 15.17.2 には次のように記載されています。

[I]整数除算の除数の値が 0 の場合、ArithmeticException がスローされます。

浮動小数点除算の結果は、IEEE 754 演算の規則によって決定されます。

(をちょきちょきと切る)

非ゼロの有限値をゼロで除算すると、符号付き無限大になります。符号は上記の規則によって決定されます。

ここで、「なぜIEEE Infinityは何らかのエラーではなく、そうあるべきだと述べているのですか?」という疑問が生じます。IEEEの説明は次のとおりです。

ゼロ除算 (またはオーバーフロー、アンダーフロー) でプログラムが停止したり、エラーが発生したりしないのはなぜですか? 数値の標準に「非数」(NaN) が含まれるのはなぜですか? 754 モデルは堅牢なプログラムを促進します。数値アナリストだけでなく、スプレッドシート ユーザー、データベース システム、さらにはコーヒー ポットも対象としています。NaN と無限大の伝播規則により、重要でない例外を消滅させることができます。同様に、段階的アンダーフローは、精度の範囲にわたってエラー プロパティを維持します。

例外的な状況に注意が必要な場合は、トラップを介してすぐに、またはステータス フラグを介して都合のよいときに調べることができます。トラップを使用してプログラムを停止できますが、回復不能な状況は非常にまれです。組み込みシステムやネットワーク エージェントにとって、単にプログラムを停止するという選択肢はありません。多くの場合、トラップは診断情報をログに記録するか、有効な結果を代用します。

フラグは、予測可能な制御フローと速度の両方を提供します。それらを使用するには、プログラマーが例外的な条件を認識している必要がありますが、フラグの粘着性により、プログラマーは必要になるまで例外的な条件の処理を遅らせることができます。

于 2013-10-08T16:18:53.383 に答える