尝试将子项添加到一般树时出现 Java 堆栈溢出错误

时间:2021-04-30 22:01:54

标签: java tree

在 Java 中,我正在创建一个树来像基本文件系统一样运行。当我尝试向根节点添加子节点时,出现“stackoverflowerror”。我在网上读到错误意味着某处有太多的递归,但我看不到那是哪里。如何修复我的代码以防止出现错误?谢谢!

public class Node<File> {
private File data = null;
private Node<File> parent = null;
private List<Node<File>> children = new ArrayList<>();

public Node(File data){
    this.data = data;
}

public Node(File data, Node<File> parent){
    this.data = data;
    this.setParent(parent);
}

public List<Node<File>> getChildren(){
    return children;
}

public void addChild(File data){
    Node<File> child = new Node<>(data);
    child.setParent(this);
    this.children.add(child);
}

public void addChild(Node<File> child){
    child.setParent(this);
    this.children.add(child);
}

public void addChildren(List<Node<File>> children){
    children.forEach(each -> each.setParent(this));
    this.children.addAll(children);
}

public void setParent(Node<File> parent) {
    parent.addChild(this);
    this.parent = parent;
}

public File getData(){
    return this.data;
}

public void setData(File data){
    this.data = data;
}

public boolean isRoot(){
    return (this.parent == null);
}

public boolean isLeaf(){
    return this.children.isEmpty();
}

public Node<File> getParent(){
    return parent;
}

public Node<File> getRoot(){
    if(parent == null){return this;}
    return parent.getRoot();
}

public void remove(){
    if(parent!=null){
        parent.removeChild(this);
    }
}

private void removeChild(Node<File> child) {
    if(children.contains(child)){
        children.remove(child);
    }
}

}

1 个答案:

答案 0 :(得分:2)

我认为您的 addChild() 和 setParent() 方法相互委托,导致无限循环,这就是堆栈因无限递归而过载的原因。

你应该有一些停止条件来避免这个循环。

addChild() 在 child 上调用 child.setParent(),setParent() 在 parent 上再次调用 addChild(),故事继续下去,没有任何结局。

但是,您还应该检查堆栈跟踪以确认情况确实如此。