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 回答