Почему возникает ConcurrentModificationException

Рейтинг: 1Ответов: 1Опубликовано: 02.03.2015

постоянно получаю ошибку, когда пытаюсь добавить объекты на карту. Гугл мне не дал ясности, стек оверфлоу я тоже, не понял, что пытается донести. Единственное, что понял, одновременно читаю и записываю в этот список.

p.s. прошу прощения за орфографию

private void addGeoObjectsToMap() {
    List<? extends GeoObject> list = getCurrentPageObjectsList();
    if (list != null) {
        for (GeoObject obj : list) {
            addUserMarker(obj);
        }
    }
}

Ответы

▲ 6Принят

ConcurrentModificationException выбрасывается тогда, когда вы пытаетесь вставлять или удалять из коллекции элементы во время перебора элементов этой коллекции. Это потенциально может привести к некорректному поведению итератора (возвращению неверного следующего элемента или некорректному результату метода hasNext()), поэтому все стандартные коллекции предпочитают сразу пресечь подобное поведение.

Если вам необходимо удалять элементы из коллекции во время перебора её элементов, то вам следует использовать явный перебор при помощи итератора:

List<String> strList = new ArrayList<>();
Iterator<String> strIter = strList.iteraror();
while (strIter.hasNext()) {
    String str = strIter.next();
    if (/* condition */) {
        strIter.remove();
    }
}

Вставка элментов в коллекцию во время перебора её элементов стандартными коллекциями не поддерживается.

UPD

дело в том, что мне не нужно одновременно читать и записывать в коллекцию

Будем считать, что не - это опечатка и вам на самом деле нужно это делать. В таких случаях делают копию исходной коллекции. Итерация идёт по исходной коллекции, а вставка и удаление - из копии. После завершения цикла исходную коллекцию заменяют на новую.