java .lang.stackoverflowerror при добавлении в связанный список - PullRequest
0 голосов
/ 09 мая 2020

У меня возникает эта проблема при попытке добавить объект в связанный список (java util). У меня есть классы Doctor и Patient , оба наследуются от абстрактного class 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 , особенно в строке 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» ...

1 Ответ

0 голосов
/ 09 мая 2020

Исходя из toString() в сообщении об ошибке, похоже, что toString() у вас в Appointment встроено строковое представление Person, но все toString() в Person делает то же самое. для Appointment. Это привело бы к StackOverflowError каждый раз, когда вы вызываете toString(), потому что строка будет постоянно расширяться (и здесь связь является двунаправленной).

Это также сделало бы невозможным распечатать ваш LinkedList, не обнаружив ошибки.

Решение состоит в том, чтобы toString() одного из этих классов не встраивать toString() другого. А еще лучше переосмыслить свою модель и определить, действительно ли вам нужны эти двунаправленные отношения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...