1

以下のコード サンプルを実行しようとしましたが、StackOverflow エラーが発生しました。無限ループに陥りそうです。ここで何が起こっているのかを知るために誰か助けてくれませんか?

以下のコードスニペットを見つけてください

public class ConstructorExample {

    private ConstructorExample c1 = new ConstructorExample();

    public ConstructorExample(){
        throw new RuntimeException();
    }

    public static void main(String[] str){
        ConstructorExample c = new ConstructorExample();
    }
}
4

2 に答える 2

2

メンバー private ConstructorExample c1 = new ConstructorExample(); があります。ConstructorExample クラスで。

ConstructorExample の最初のインスタンスをインスタンス化すると、JVM はその ConstructorExample にメモリを割り当て、最初のメンバー c1 をインスタンス化しようとします。このインスタンス化は、別の ConstructorExample インスタンスなどにメモリを割り当てることから始まります。

また、メンバー初期化子はコンストラクターの前に実行されるため、実行時例外は無関係です。

于 2015-03-04T13:27:19.747 に答える
0

予想通りです。ConstructorExampleコンストラクターを呼び出す前にインスタンス変数が初期化される main メソッドからのインスタンス作成が試行されます。

private ConstructorExample c1 = new ConstructorExample();

その後、サイクルが再び繰り返され、単一のインスタンスを完全に作成することすら完了せずに、スタックオーバーフローを引き起こすメモリをますます割り当て続けます。

于 2015-03-04T14:01:29.847 に答える