添加到链表时出现java.lang.stackeoverpower错误



我在尝试将对象添加到链接列表时遇到了这个问题(javautil(我有一个DoctorPatient类,它们都继承自抽象类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()。更好的是,你应该重新思考你的模型,并确定你是否真的需要这种双向关系。

相关内容

  • 没有找到相关文章

最新更新