2014-10-24 4 views
3

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

Для контекста соответствующими частями основного являются: System.out.println (класс1); adminStaff1.assignInstructor (класс1, инструктор1); System.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."); 
    } 
} 

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

ответ

4

При вызове toString() на Class она включает InstructorInstructor включает Class). Это цикл. Разбить его, либо

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

Или

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

Спасибо так много! Я предполагаю, что немного рискованно использовать автогенерируемый toString() для eclipse. – Xerunix

Смежные вопросы