如何为以下代码解析java.lang.StackOverflowError
?
班级人员
import java.util.List;
public class Person {
private String name;
private List<Person> children;
public Person() {
}
public Person(String name, List<Person> children) {
this.name = name;
this.children = children;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<Person> getChildren() {
return children;
}
public void setChildren(List<Person> children) {
this.children = children;
}
@Override
public String toString() {
return "Person [name=" + name + ", children=" + children + "]";
}
}
Class TestPerson
import java.util.ArrayList;
import java.util.List;
public class TestPerson {
public static void main(String[] args) {
List<Person> emptylist = new ArrayList<Person>();
Person p3 = new Person("X", emptylist);
Person p2 = new Person("Y", emptylist);
Person p1 = new Person("Z", emptylist);
p2.getChildren().add(p3);
p1.getChildren().add(p2);
System.out.println(p1);
}
}
您对不同人的孩子使用相同的列表。从构造函数中删除children参数,并在构造函数中执行children = new ArrayList <>()。
您的所有Parent实例都具有相同的子代列表,因为您构造了一个ArrayList并将其用作所有三个Person的子代。因此,您具有递归数据结构。为每个人创建一个不同的列表。
p1
,p2
和p3
-都和他们的子代添加相同的emptylist
,因此当您将p3
作为p2
的子代添加时,然后又将其作为子代p1
,基本上就像说:连续将emptylist
添加到emptylist
,由于不确定的递归导致堆栈溢出!
您可以在Person类中具有重载的构造函数,而无需传递List
for children属性。