Почему это исключение выводится из моего поиска итератора? - PullRequest
1 голос
/ 10 апреля 2019

Я получаю исключение ConcurrentModificationException при попытке использовать Iterator для поиска определенного целого числа.

Я не знаю, почему это происходит.Любое исследование, которое я изучал, говорит, что это исключение, которое появляется, когда я пытаюсь редактировать список внутри цикла for.Я этого не делаю, на самом деле я даже не редактирую список в Итераторе.

private ArrayList<Integer> list = new ArrayList();
private ListIterator<Integer> iterator = list.listIterator();

public void search(int input) {
    while (iterator.hasNext()) {
        if (input == iterator.next()) {
            System.out.println(iterator.next());
       }
    } 
}

public static void main(String[] args) {
    SearchList sl = new SearchList();

    for (int i = 0; i < 10; i++) {
        sl.list.add(i);
    }

    System.out.println(sl.list);

    sl.search(6);
}

ОЖИДАЕМЫЙ ВЫХОД:

6

АКТУАЛЬНЫЙ ВЫХОД:

Exception in thread "main" java.util.ConcurrentModificationException
    at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909)
    at java.util.ArrayList$Itr.next(ArrayList.java:859)
    at SearchList.search(SearchList.java:23)
    at SearchList.main(SearchList.java:38)```

Ответы [ 2 ]

4 голосов
/ 10 апреля 2019

Вы создаете итератор (при инициализации экземпляра класса) и после этого изменяете базовый список.
Итератору это не нравится.

Как говорит Javadoc:

Итераторы, возвращаемые методами итератора этого класса и listIterator, работают без сбоев: если список структурно изменяется в любое время после создания итератора, любым способом, кроме использования собственных методов удаления или добавления итератора, Итератор сгенерирует исключение ConcurrentModificationException. Таким образом, перед одновременной модификацией итератор быстро и чисто дает сбой, вместо того, чтобы рисковать произвольным недетерминированным поведением в неопределенное время в будущем.

3 голосов
/ 10 апреля 2019

Проблема здесь в том, что вы создали iterator в начале, а затем изменили список.

Решение: В методе search получите iterator и работайте над ним.

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