繁体   English   中英

添加到链接列表时出现 java.lang.stackoverflowerror

[英]java.lang.stackoverflowerror when adding to a Linked-List

我在尝试将object添加到链表(java util )时遇到了这个问题

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() Method threw 'java.lang.StackOverflowError' exception. Cannot evaluate Appointment.toString()

当我调试它时,我可以看到异常发生在 LinkedList.java 上,特别是在size++ 行

   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() 更好的是,您应该重新考虑您的 model 并确定您是否真的需要这种双向关系。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM