Java追踪混乱

时间:2016-02-05 16:43:34

标签: java tracing

有人可以帮助我理解为什么java试图在b之前创建一个实例。而且,为什么它在第2行和第3行之间循环?

public class Winterfell {

  private Winterfell a= new Winterfell();

    public Winterfell() throws Exception {
        throw new Exception("Fire and Ice");
    }

    public static void main(String[] args) {
        try {
            Winterfell b = new Winterfell();
            System.out.println("Surprise!");
        } catch (Exception ex) {
            System.out.println("I told you so");
        }
    }
}

2 个答案:

答案 0 :(得分:3)

这将导致StackOverflowError

通过让一个字段引用同一个类的新对象,或者通过在构造函数中创建同一个类的新对象,您可以无限次地调用来创建一个新的Winterfell对象。

这就是它循环的原因。

要解决此问题,您可能希望删除private Winterfell a= new Winterfell();,以便创建单个Winterfell对象。

答案 1 :(得分:2)

private Winterfell a= new Winterfell();

在调用Winterfell的构造函数之前调用,因为它是数据成员。查看the Oracle documentation for object construction了解详情。