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

Nit*_*gla 6 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");
    }

}
Run Code Online (Sandbox Code Playgroud)

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

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

Era*_*ran 23

您的main方法创建一个Cloninginstance(Cloning c=new Cloning();),它会导致实例变量c(Cloning c=new Cloning();)的初始化,从而创建另一个Cloning实例,依此类推......

你有一个无限的构造函数调用链,这导致了StackOverflowError.

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

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

Cloning c=new Cloning();
Run Code Online (Sandbox Code Playgroud)

static Cloning c=new Cloning();
Run Code Online (Sandbox Code Playgroud)

  • @Bathsheba嗯,原始实例是由main方法创建的.如果没有该实例化,则不会初始化任何实例变量,因此无法启动无限构造函数调用链.我同意这个错误可能是没有将实例变量声明为静态(这似乎是OP想要的). (2认同)

Rob*_*gam 7

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


Bat*_*eba 7

没有你的意思写static Cloning c = new Cloning(); 外面 main, c = new Cloning(); main呢?

否则,c每次运行时都会得到一个新实例,这将导致a StackOverflowError.

目前本地的创作cCloning c = new Cloning();(其中阴影c)踢了整个事情了.