StackOverflowError由同一类型的非静态成员引起

时间:2012-10-24 20:32:22

标签: java exception stack-overflow

以下代码段中的代码会引发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("");没有任何意义,但该语句不应该被类中的任何代码使用,那么该语句如何导致抛出异常?< / p>

2 个答案:

答案 0 :(得分:4)

每次调用构造函数时,都会创建一个实例,从而执行初始化代码

private Main m=new Main("");

调用构造函数等

你可能想要

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

为了保持单身。

答案 1 :(得分:1)

你的程序导致堆栈溢出是绝对正常的...... 编译器不检查你的成员m是否在你的代码中被使用,虽然你是对的,它可以做到,可能有副作用:对象没有被构建... 为了构造一个Main对象,必须构造另一个Main对象(私有Main m成员)...它提供无限递归,因此堆栈oveflow