使用toStrings()方法出现堆栈溢出错误(Java)

5
我的toString()方法似乎出现了无限循环,但我不确定问题出在哪里。我已经调试了几个小时了,也没有发现任何错误。
为了更好的理解,以下是主要部分的相关内容: System.out.println(class1); adminStaff1.assignInstructor(class1, instructor1); System.out.println(class1);
第一个println函数可以正常运行,但在调试时我看到一个源代码查找错误。第二个class1创建了StackOverflowError,即:
Exception in thread "main" java.lang.StackOverflowError
at java.lang.AbstractStringBuilder.append(Unknown Source)
at java.lang.StringBuilder.append(Unknown Source)
at java.lang.StringBuilder.<init>(Unknown Source)
at Instructor.toString(Instructor.java:59)
at java.lang.String.valueOf(Unknown Source)
at java.lang.StringBuilder.append(Unknown Source)
at Class.toString(Class.java:89)
at java.lang.String.valueOf(Unknown Source)
at java.lang.StringBuilder.append(Unknown Source)
at java.util.AbstractCollection.toString(Unknown Source)
at java.lang.String.valueOf(Unknown Source)
at java.lang.StringBuilder.append(Unknown Source)
at Instructor.toString(Instructor.java:59)

Class的toString方法是:
@Override
public String toString() {
    return "Class [instructor=" + instructor + ", lectureHall="
            + lectureHall + ", currentEnrollment=" + currentEnrollment
            + ", timeSlot=" + timeSlot + ", filled=" + filled
            + ", studentList=" + studentList + "]";
}

Instructor的toString方法是:

@Override
public String toString() {
    return "Instructor [salary=" + salary + ", classList=" + classList
            + ", openTimeSlots=" + openTimeSlots + ", "
            + super.toString() + "]";
}

而super.toString()的结果是:

@Override
public String toString() {
    return "[idNumber=" + idNumber + ", email=" + email
            + "]";
}

我不确定为什么,但是adminStaff1.assignInstructor似乎也在造成问题,它是:

public void enrollStudent(Student student, Class aClass){
    aClass.checkIfFilled();
    if(!aClass.getFilled()){
        aClass.addStudent(student);
        student.addClass(aClass);
        aClass.increaseEnrollment();
    } else {
        System.out.println("Could not add student because the class is currently full.");
    }
}

我希望你能帮助我理解出了什么问题,非常感谢。

1个回答

7
当你在一个 Class 上调用 toString() 方法时,它会包含 Instructor(而 Instructor 又包含 Class),这是一个循环。为了打破这个循环,请:
return "Instructor [salary=" + salary + /* ", classList=" + classList */
        + ", openTimeSlots=" + openTimeSlots + ", "
        + super.toString() + "]";

或者,

return "Class [lectureHall=" + lectureHall + ", currentEnrollment=" 
        + currentEnrollment + ", timeSlot=" + timeSlot + ", filled=" + filled
        + ", studentList=" + studentList + "]";

1
非常感谢!我想使用Eclipse自动生成的toString()有点冒险。 - Xerunix

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接