Ошибка переполнения стека с toStrings() (java)

Два из моих toString() находятся в бесконечном цикле, но я не уверен, в чем проблема. Я отлаживаю это уже несколько часов и не вижу ничего неправильного.

Для контекста соответствующими частями main являются: System.out.println(class1); adminStaff1.assignInstructor(класс1, инструктор1); Система.out.println (класс1);

Первый 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)

ToString для класса:

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

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.");
    }
}

Я искренне признателен, если кто-нибудь может помочь мне понять, что не так. Спасибо.


person Xerunix    schedule 24.10.2014    source источник


Ответы (1)


Когда вы вызываете toString() на Class, он включает InstructorInstructor включает Class). Это цикл. Сломай его либо

return "Instructor [salary=" + salary + /* ", classList=" + classList */
        + ", openTimeSlots=" + openTimeSlots + ", "
        + super.toString() + "]";

Or,

return "Class [lectureHall=" + lectureHall + ", currentEnrollment=" 
        + currentEnrollment + ", timeSlot=" + timeSlot + ", filled=" + filled
        + ", studentList=" + studentList + "]";
person Elliott Frisch    schedule 24.10.2014
comment
Большое спасибо! Я думаю, немного рискованно использовать автоматически сгенерированный eclipse toString(). - person Xerunix; 24.10.2014