为什么我在构造函数中收到StackOverflowError异常

时间:2016-03-07 13:17:03

标签: java stack-overflow

public class Cloning {

    Cloning c=new Cloning();
    public static void main(String[] args) {

        Cloning c=new Cloning();
        c.print();
    }

    public void print(){
        System.out.println("I am in print");
    }

}

在上面的代码中,我有一个简单的类和一个类级实例,我也有一个同名的本地实例。运行上面的代码时,我得到以下异常:

Exception in thread "main" java.lang.StackOverflowError
    at com.java8.Cloning.<init>(Cloning.java:6)

3 个答案:

答案 0 :(得分:23)

您的main方法会创建一个Cloning实例(Cloning c=new Cloning();),这会导致实例变量cCloning c=new Cloning();)的初始化,从而创建另一个Cloning实例,等等......

你有一个无限的构造函数调用链,它会导致StackOverflowError

  

在上面的代码中,我有一个简单的类和一个类级实例

您没有班级实例。您有一个实例级实例。如果您需要类级实例,请更改

Cloning c=new Cloning();

static Cloning c=new Cloning();

答案 1 :(得分:7)

每次构造Cloning时都会实例化类Cloning,这会导致实例化的递归。

答案 2 :(得分:7)

你不打算在 static Cloning c = new Cloning(); main 之外写<{1}} c = new Cloning();而不是?

否则,每次运行时,您都会获得main的新实例,这将导致c

目前,在StackOverflowError阴影字段c)中创建本地Cloning c = new Cloning();可以解决所有问题。