我在尝试将对象添加到链接列表时遇到了这个问题(javautil(我有一个Doctor和Patient类,它们都继承自抽象类Person
public abstract class Person {
private LinkedList<Appointment> scheduledAppointments = new LinkedList<Appointment>();
//irrelevant code
public boolean addAppointment(Appointment appointment){
return this.scheduledAppointments.add(appointment);
}
参与者属性在链接列表中有一名医生和一名患者
public class Appointment {
private ArrayList<Person> participants = new ArrayList<Person>();
...
public Appointment(Person doctor, Person patient, int day, int month, int year, double startHour, Procedure procedure) {
this.participants.add(doctor);
this.participants.add(patient);
...
}
public void addAppointmentToParticipants(){
for (Person person : participants) {
person.addAppointment(this);
}
}
当我尝试将约会添加到每个参与者时,就会出现问题:Method threw 'java.lang.StackOverflowError' exception. Cannot evaluate Appointment.toString()
当我调试它时,我可以看到异常发生在LinkedList.java上,特别是在尺寸++线上
void linkLast(E e) {
final Node<E> l = last;
final Node<E> newNode = new Node<>(l, e, null);
last = newNode;
if (l == null)
first = newNode;
else
l.next = newNode;
size++;
modCount++;
}
我不明白为什么我会遇到这个问题,"toString"和它有什么关系…
根据错误消息中的toString()
,看起来Appointment
中的任何toString()
都嵌入了Person
的字符串表示,但Person
中的任何toString()
都对Appointment
执行相同的操作。无论何时调用toString()
,这都会导致StackOverflowError
,因为字符串会不断扩展(这里的关系是双向的(。
这也会使打印出您的LinkedList
时不可能不遇到错误。
解决方案是使其中一个类的toString()
不嵌入另一个类的toString()
。更好的是,你应该重新思考你的模型,并确定你是否真的需要这种双向关系。