1

我试图运行以下代码示例,但出现 StackOverflow 错误。它似乎陷入了无限循环。任何人都可以帮助我知道这里发生了什么吗?

请在下面找到代码片段

public class ConstructorExample {

    private ConstructorExample c1 = new ConstructorExample();

    public ConstructorExample(){
        throw new RuntimeException();
    }

    public static void main(String[] str){
        ConstructorExample c = new ConstructorExample();
    }
}
4

2 回答 2

2

您有成员 private ConstructorExample c1 = new ConstructorExample(); 在 ConstructorExample 类中。

当您实例化 ConstructorExample 的第一个实例时,JVM 会为该 ConstructorExample 分配内存,然后尝试实例化第一个成员 c1。此实例化从为另一个 ConstructorExample 实例分配内存开始,依此类推。

此外,运行时异常是无关紧要的,因为成员初始化程序在构造函数之前执行。

于 2015-03-04T13:27:19.747 回答
0

正如预期的那样。尝试从 main 方法创建实例ConstructorExample,为此在调用构造函数之前初始化实例变量。

private ConstructorExample c1 = new ConstructorExample();

然后再次重复循环并继续分配越来越多的内存导致堆栈溢出,甚至没有完成完全创建单个实例。

于 2015-03-04T14:01:29.847 回答