8

この質問に似たこのサンプルコードを見る:

public class A {
    public static void main(String args[]){
        A a = new A();
        System.out.println(a.equals((a = null)));
    }
}

これはfalseを出力します。NullPointerException で失敗しないのはなぜですか? equals メソッドを実行する前に代入を処理する必要がありますが、行全体が評価されるまで equals が呼び出される参照には影響しませんか?

Java 言語仕様のどこにこれが記述されているかわかりませんでした。

4

2 に答える 2

2

あなたが興味を持っているJLSのセクションは

15.12.4. メソッド呼び出しの実行時評価

実行時のメソッド呼び出しには 5 つのステップが必要です。第1に、ターゲット基準が計算され得る。次に、引数式が評価されます

aしたがって、まだ null 以外の値を保持している間にターゲットの評価が行われ、メソッド呼び出しの引数としてTHENaが設定されます。nullしたがって、equals メソッドは、this以前は として知られていたオブジェクトへの参照を使用して呼び出されます。このオブジェクトはa現在も存在し、null 引数が指定されています。

于 2014-05-23T18:21:59.250 に答える