Exception in thread "main" java.util.ConcurrentModificationException при изменении ArrayList

Рейтинг: -2Ответов: 1Опубликовано: 18.01.2015
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:859)
at java.util.ArrayList$Itr.next(ArrayList.java:831)
at ru.mc.Bancomat.Main.main(Main.java:86)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)  

Объясните, из-за чего возможна ошибка?

Ответы

▲ 7Принят

Мой модуль телепатии подсказывает, что вы пытаетесь изменять коллекцию когда перебираете её элементы. Например, так:

for (String s : listOfStrings) {
    listOfStrings.remove(s);
}

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

Iterator<String> it = listOfString.iterator();
while (it.hasNext()) {
    String s = it.next();
    it.remove();
}

UPD

Если внимательно почитать ваш код, то выяснится, что вы всё-таки изменяете коллекцию, пока перебираете её элементы. В вашем классе Main глобально объявлен список users, элементы которого вы перебираете, когда регистрируете нового пользователя:

for (User p : users) {
    int pincodreal = p.getPincod();
    if(pincodreal == pincod) {
        menu();
    } else System.out.println("Неверный пинкод");
}

Здесь вы вызываете метод menu(), в котором вызываете метод exit(), в котором, в свою очередь, зачем-то добавляете новый элемент в список users. В этот момент и происходит ошибка: пока вы перебираете элементы коллекции, нельзя добавлять или удалять из этой коллекции элементы. Поэтому либо выходите из цикла for (User p : users) прежде чем вызывать menu(), либо перепишите этот цикл с использованием итераторов.

И ещё: пересмотрите подход к организации меню. Все вложенные if-ы можно заменить на конструкции switch. Это упростит код для понимания и застрахует вас от потенциальных ошибок.