2016-02-16 2 views
0

Я не понимаю, почему это происходит. Я занимался некоторыми исследованиями по другим вопросам, и выяснил, что вы не можете изменять коллекцию при использовании цикла for. Тем не менее, я использую Iterator, почему он не работает?Вызвано: java.util.ConcurrentModificationException

int counter = 0; 
    int otherCounter = 0; 
    ArrayList<Character> chars = new ArrayList<Character>(); 
    Iterator<Character> i = chars.iterator(); 
    for (char s : e.getMessage().toCharArray()) { 
     chars.add(s); 
    } 
    while (i.hasNext()) { 
     char s = i.next(); 
     if (chars.get(otherCounter + 1) == s) { 
      counter++; 
     } else { 
      counter = 0; 
     } 
     if (counter >= 2) { 
      i.remove(); 
     } 
     otherCounter++; 
    } 

Я получаю ошибку на этой линии по каким-либо причинам: символ s = i.next();

ответ

2

Вы добавляете в коллекцию после создания итератора.
Это исключает это исключение.

Вам необходимо создать итератор после завершения изменения коллекции.

0

Это связано с тем, что «расширенный цикл», когда вы его используете, создает Iterator за кулисами.

В самом деле, когда вы пишете:

for (X x: whatever) { 
    // do something with x 
} 

"реальный", сгенерированный код выходит что-то вроде:

Iterator<X> iterator = whatever.iterator(); 

while (iterator.hasNext()) { 
    X x = iterator.next(); 
    // do something with x 
} 

И это верно, если whatever реализует Iterable<X> (который List делает; в факт, любой Collection)

В вашем примере вы создаете List<Character>, создайте ель st Iterator<Character> над ним, а ваш цикл for создает другойIterator<Character>, над тем же самым списком.

Обратите внимание, что вы создали первое, прежде чем изменить свой List ... Отсюда и результат. Первый Iterator, который вы повторно используете только потом, обнаружит, что в то время его базовый список был изменен: стрела.

+0

Что вы пишете правильно, но какое отношение имеет к этому вопросу? Я не понимаю, как это объясняет ConcurrentModificationException, тем более, что цикл for for итерации выполняется по другой коллекции, чем явно созданный итератор. –

+0

@ErwinBolwidt посмотреть сообщение обновить – fge

Смежные вопросы