如何解决从toString方法抛出的java.lang.StackOverflowError

问题描述 投票:0回答:4

如何为以下代码解析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);
    }
}
java arraylist tostring
4个回答
1
投票

您对不同人的孩子使用相同的列表。从构造函数中删除children参数,并在构造函数中执行children = new ArrayList <>()。


1
投票

您的所有Parent实例都具有相同的子代列表,因为您构造了一个ArrayList并将其用作所有三个Person的子代。因此,您具有递归数据结构。为每个人创建一个不同的列表。


1
投票

p1p2p3-都和他们的子代添加相同的emptylist,因此当您将p3作为p2的子代添加时,然后又将其作为子代p1,基本上就像说:连续将emptylist添加到emptylist,由于不确定的递归导致堆栈溢出!


0
投票

您可以在Person类中具有重载的构造函数,而无需传递List for children属性。

© www.soinside.com 2019 - 2024. All rights reserved.