Второе обращение метода с итератором вызывает исключение ConcurrentModificationException - PullRequest
0 голосов
/ 21 февраля 2020

Что я пытаюсь сделать - дважды вызвать метод для двух разных List

:

  • Элемент P должен быть удален, если isTranslation () имеет значение true.
  • Элемент P и следующий элемент должны быть удалены, если isTitle () имеет значение true;

Я выполняю следующий код:

private List<P> nlPars; //initialised in constructor
private List<P> enPars; //initialised in constructor

public void build(){
...
  removeHeaders(nlPars); //first time calling, no problem
  removeHeaders(enPars); //second time calling, throws ConcurrentModificationException
...
}

, вызывающий этот метод:

    @VisibleForTesting
    void removeHeaders(final List<P> pars) {
        pars.removeIf(p -> isTranslation(p));

        for (final ListIterator<P> it = pars.listIterator(); it.hasNext(); ) {
            if (isTitle(it.next())) {
                it.remove();
                if (it.hasNext()) {
                    it.next();
                    it.remove();
                }
                break;
            }
        }
    }

Понятия не имею почему. Отладчик говорит мне, что во второй раз pars.listIterator () не может быть оценен / выдает исключение ConcurrentModificationException.

Я искал несколько часов, чтобы это исправить. Может быть, кто-то может помочь!

С уважением,

Барт

1 Ответ

0 голосов
/ 21 февраля 2020

Я решил, проблема была не здесь. Проблема заключалась в создании enPars en nlPars. Они были получены как nlPars = pars.subList(...). Это нормально, но они являются представлениями в списке парсов, и итератор одинаков, поэтому проблема.

Изменение ее решило проблему:

enPars = new ArrayList<P>(pars.subList(0, i));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...