创建子类时出现StackOverflowError

时间:2018-07-14 14:31:57

标签: java recursion javafx stack-overflow subclass

我的超类:

public class Node {
    public MyPoint myPoint = new MyPoint();
}

我的空子类:

public class MyPoint extends Node {

}

以下问题是我所能找到的最接近的问题,但是在这种情况下,我的子类为空,没有构造函数。

Calling a subclass constructor from a superclass

我收到以下错误:

Exception in thread "JavaFX Application Thread" java.lang.StackOverflowError
...
at engine.MyPoint.<init>(MyPoint.java:3)
at engine.Node.<init>(Node.java:28)
at engine.MyPoint.<init>(MyPoint.java:3)
at engine.Node.<init>(Node.java:28)
at engine.MyPoint.<init>(MyPoint.java:3)
at engine.Node.<init>(Node.java:28)
...

我不明白为什么以及为什么没有递归。 怎么样

public MyPoint myPoint = new MyPoint();

与之不同(例如,在JavaFX中),而创建一个新的组并不会给我错误吗?

public Group group = new Group();

2 个答案:

答案 0 :(得分:5)

MyPoint扩展了Node,因此,在创建MyPoint的实例时,首先必须初始化其父级Node。这意味着初始化myPiont成员,依此类推,直到获得StackOverflowError

这里没有足够的上下文来建议更改,但是您可能应该失去此成员。

答案 1 :(得分:1)

如果您的Node类绝对需要MyPoint字段,则可以选择以下几种方法:

  • 您完全确定MyPoint需要从Node扩展吗?实际上是节点生物吗?如果没有,请解决此问题。如果是这样,那么还有其他修复方法。...
  • MyPoint是否对于每个Node实例都不唯一?如果不是,请将其设置为静态字段,问题解决。我怀疑是这样,导致我们...
  • 如果MyPoint绝对需要从Node扩展,并且对于每个Node实例都必须是唯一的,那么您必须在其中传递引用,这意味着更改此内容:

public class Node {
    public MyPoint myPoint = new MyPoint();
}

对此:

public class Node {
    public MyPoint myPoint;  // note that MyPoint NOT created here

    public Node(MyPoint myPoint) {
        this.myPoint = myPoint; // but rather passed in HERE
    }
}   

这样,您不必每次创建Node时都递归创建Node对象,而是将MyPoint实例的创建与Node实例分开。可替代地,这也可以使用设置方法来解决。