0

次のスニペットのコードはをスローしjava.lang.StackOverflowErrorます。

public class Main
{
    private Main m=new Main("");  //This statement causes the exception.

    private Main(String s)
    {
        System.out.println(s);
    }

    public static void main(String[] args)
    {
        try
        {
            Main m1=new Main("The constructor called.");
            System.out.println("Successful!");
        }
        catch (Exception ex)
        {
            System.out.println(ex);
        }
    }
}

このステートメントprivate Main m=new Main("");をクラス自体の中に意図的に記述する意味はありませんが、そのステートメントがクラス内のどのコードによっても使用されることは想定されていません。そのステートメントで例外がスローされるのはどうしてですか。

4

2 に答える 2

4

コンストラクターを呼び出すたびに、インスタンスを作成して初期化コードを実行します

private Main m=new Main("");

コンストラクターなどを呼び出します。

あなたはおそらくしたい

private static Main m=new Main("");

シングルトンを維持するために。

于 2012-10-24T20:33:51.193 に答える
1

プログラムがスタックオーバーフローを引き起こすのは絶対に正常です...コンパイラは、メンバー m がコードで使用されているかどうかをチェックしません。 .. Main オブジェクトを構築するには、別の Main オブジェクト (プライベート Main m メンバー) を構築する必要があります ... これにより、無限再帰が発生するため、スタック オーバーフローが発生します。

于 2012-10-24T20:50:33.233 に答える