1

Друзья, привет! Помогите разобраться. При удалении элемента из двухсвязного списка возникает ошибка - Exception in thread "main" java.lang.NullPointerException: Cannot read field "value" because "current" is null

Ошибка возникает в работе метода get(), так как один элемент из списка удален, а get() "об этом не узнает" и выводит первоначальный список.

Не пойму, в какой строчке get() поставить ограничение вывода значений до момента != null ?


    @Override
    public T get(int i) {
        if (i < 0 || i >= length ()) {
            throw new IndexOutOfBoundsException ();
        }
        Node<T> current = first;
        for(int j=0; j<i; j++) {
            current = current.next;
        }
       return current.value;
    }
@Override
public void remove(T e) {
    Node&lt;T&gt; current = first;
    while (current.value != e) {
        current = current.next;
        if (current == null) {
            throw new IndexOutOfBoundsException ();
        }
    }
    if (current.next != null) {
        current.next.prev = current.prev;
    }
    current.prev.next = current.next;
}


Dmitriy
  • 13
  • 4

1 Answers1

0
        if (current == null) {
            throw new IndexOutOfBoundsException ();
        }

Кого Вы здесь хотите запутать? Надо:

        if (current == null) {
            throw new ValueNotFoundException();
        }

@Override
public void remove(T e) {
    Node<T> current = first;
    while (current != null && current.value != e) {
        current = current.next;
    }
    if (current == null) {
        throw new ValueNotFoundException();
    }
    if (current.next != null) {
        current.next.prev = current.prev;
    }
    if (current.prev != null) {
        current.prev.next = current.next;
    }
}
  • Спасибо, по архитектуре кода remove() у Вас правильнее. Но ошибка не исчезла, она появляется в методе get() при вызове оператора return. – Dmitriy Aug 21 '21 at 21:27
  • @Dmitriy "При удалении элемента из двухсвязного списка возникает ошибка" - ?? –  Aug 21 '21 at 21:58
  • Да, при удалении элемента из двухсвязного списка. При вызове метода remove() возникает ошибка в выполнении метода get(). – Dmitriy Aug 21 '21 at 22:24
  • @Dmitriy Хорошо. Сейчас я догадаюсь. Вы не обновляете количество элементов, и length() возвращает неправильное число. –  Aug 21 '21 at 23:13
  • Да, похоже... Дело в том, что в задании выше я указал только часть кода из общего задания.

    Реализовать структуру двусвязного списка, реализовав интерфейс: public interface List { T get(int i); void put(T e); void put(int i, T e); void remove(int i); void remove(T e); int length(); }

    Удалось выяснить, что при добавлении новых элементов в двусвязный список нужно использовать HashMap.

    – Dmitriy Aug 24 '21 at 14:42
  • @Dmitriy Что делает length()? –  Aug 24 '21 at 15:04
  • HashMap тут ни при чем. –  Aug 24 '21 at 15:05
  • length() возвращает количество элементов в двусвязном списке – Dmitriy Aug 24 '21 at 16:07
  • @Dmitriy Это я и сам понимаю. Что он делает внутри? –  Aug 24 '21 at 16:08
  • Для него переопределен метод из интерфейса Override public int length() { return size; } В main создается объект, который выводит список в консоль for (int i = 0; i < list.length(); i++) { System.out.println (list.get (i)); } – Dmitriy Aug 24 '21 at 16:14
  • @Dmitriy Я так и думал. Что Вы думаете о приведении size в соответствие с новым количеством элементов при удалении элемента? –  Aug 24 '21 at 16:16
  • хороший вопрос... спасибо за совет, сейчас подумаю... – Dmitriy Aug 24 '21 at 16:20
  • @Dmitriy Пожалуйста. Знак "галочка" - слева от ответа. –  Aug 25 '21 at 12:49