Застрял в "java.util.ConcurrentModificationException" - PullRequest
6 голосов
/ 13 апреля 2011

Вот мой код:

// eventList is a LinkedList

public void run() {

    Iterator<Event> it = eventList.iterator();
    int size = eventList.size();

    while(size > 0) {
        while(it.hasNext()) {
            Event e = it.next(); //flaged line

            if(e.ready()) {
                System.out.println(e);
                e.action();
                eventList.remove(e);
                --size;
            }
        }
    }
}

Ошибка java.util.ConcurrentModificationException выдается на подкладке флага (Event e = it.next();).Вы видите ошибку в моем коде, которая делает очевидной причину этого исключения?

Ответы [ 2 ]

17 голосов
/ 13 апреля 2011

Вы изменяете eventList, используя eventList.remove(), итерируя по нему. Вы не должны этого делать, или Iterator станет непригодным для использования.

Просто замените eventList.remove(e) на it.remove(), и все должно быть в порядке.

Кроме того, вы можете легко запустить бесконечный цикл, если одно из ваших событий не будет готово при первом запуске, потому что it.hasNext() никогда не вернет true, как только вернет false, но size не быть модифицирован либо. Одним из решений было бы переместить всю Iterator it = ... строку внутрь первого while цикла.

Я бы также изменил внешний цикл while, чтобы использовать while (!e.isEmpty()) вместо попытки вручную отследить размер eventList.

1 голос
/ 13 апреля 2011

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

...