在 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);
}
}
}
答案 0 :(得分:2)
我认为您的 addChild() 和 setParent() 方法相互委托,导致无限循环,这就是堆栈因无限递归而过载的原因。
你应该有一些停止条件来避免这个循环。
addChild() 在 child 上调用 child.setParent(),setParent() 在 parent 上再次调用 addChild(),故事继续下去,没有任何结局。
但是,您还应该检查堆栈跟踪以确认情况确实如此。