为什么我得到StackOverflowError

2022-09-03 09:40:02
public class Category {

    private Category parentCategory;
    private Set<Category> childCategories;
    private String name;

    public Category() {
        childCategories = new HashSet<Category>();
    }

    public Category getParentCategory() {
        return parentCategory;
    }

    public void setParentCategory(Category parentCategory) {
        this.parentCategory = parentCategory;
    }

    public Set<Category> getChildCategories() {
        return childCategories;
    }

    public void setChildCategories(Set<Category> childCategories) {
        this.childCategories = childCategories;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Category [childCategories=" + childCategories + ", name="
                + name + ", parentCategory=" + parentCategory + "]";
    }

}


public static void main(String[] args) {
        Category books = new Category();
        books.setName("Books");
        books.setParentCategory(null);

        Category novels = new Category();
        novels.setName("Novels");
        novels.setParentCategory(books);

        books.getChildCategories().add(novels);
        //novels.setChildCategories(null);

        System.out.println("Books > " + books);
    }

正在生成 .System.out.printlnStackOverflowError


答案 1

当你做你的,你叫的孩子。这里没有问题,除了你在这里打电话给父母。这将调用的孩子,等等。toString()toString()toString()toString()

漂亮的无限循环。

摆脱它的最佳方法是将方法更改为:toString()

@Override
public String toString() {
    return "Category [childCategories=" + childCategories + ", name="
            + name + ", parentCategory=" + parentCategory.getName() + "]";
}

这样,您就不会打印父类别,而只能打印其名称,没有无限循环,没有StackOverflowError。

编辑:正如Bolo在下面所说,您需要检查父类别是否为空,如果它是,则可能有一个。NullPointerException


资源:

关于同一主题:


答案 2

由于错误是问题,因此必须在 .System.out.printlntoString()

问题是,使用它们的方法为打印的对象同时打印父对象和子对象。因此,当您打印类别时,它会调用父级,该父级调用子级,调用父级调用子级,依此类推,直到堆栈耗尽。toString()CategorytoString()toString()toString()toString()toString()


推荐