代码之家  ›  专栏  ›  技术社区  ›  Hydraxia

生成子类时StackOverflowError

  •  1
  • Hydraxia  · 技术社区  · 6 年前

    我的超类:

    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 回复  |  直到 6 年前
        1
  •  1
  •   Hovercraft Full Of Eels    6 年前

    如果您的节点类绝对需要mypoint字段,那么您有几个选项:

    • 您确定mypoint需要从节点扩展吗?它实际上是一个节点生物吗?如果没有,就把这个处理掉,问题解决了。如果是这样,那么还有其他的解决方法……
    • 对于每个节点实例,mypoint不是唯一的吗?如果不是,把它变成一个静态的场,问题就解决了。我怀疑这是真的,导致我们…
    • 如果mypoint绝对需要从节点扩展, 需要对每个节点实例都是唯一的,然后必须传入引用,这意味着要更改:

    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
        }
    }   
    

    这样,您不会在每次创建节点时递归地创建节点对象,而是将mypoint实例的创建与节点实例分开。或者,也可以使用setter方法来解决这个问题。

        2
  •  5
  •   Mureinik    6 年前

    MyPoint 延伸 Node ,因此当您创建 我的观点 ,首先必须初始化其父级 结点 . 这意味着初始化 myPiont 成员等等直到你得到 StackOverflowError .

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