ConcurrentModificationException при удалении элемента в ArrayList [Использование iterator.remove()]

я знаю, что мы не должны изменять ArrayList во время итерации.

Но я использую Iterator для перебора списка и iterator.remove() для удаления элемента, но все равно приводит к исключению ConcurrentModification Exception.

Моя программа не многопоточная.

У меня много массивов [класс содержит его, и я обрабатываю множество массивов объектов]

for(int i=0;i<obj.length;i++)
{
    if(k==i) continue;

    it = obj[i].arraylist.iterator();

    while(it.hasNext()){
    value = it.next();

      if(condn)  {
       it.remove();
       obj[k].arraylist.add(value);
       //k and i are not same 

      }

    }

}


person Dineshkumar    schedule 05.09.2013    source источник
comment
Пожалуйста, предоставьте полный код.   -  person Ruchira Gayan Ranaweera    schedule 05.09.2013
comment
У вас есть трассировка стека? Выглядит нормально для меня.   -  person Fildor    schedule 05.09.2013


Ответы (2)


«Обратите внимание, что Iterator.remove — это единственный безопасный способ изменить коллекцию во время итерации; поведение не указано, если базовая коллекция изменяется каким-либо другим способом во время итерации».

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

http://docs.oracle.com/javase/tutorial/collections/interfaces/collection.html

Изменить: вы также можете проверить:

if(k==i || obj[i].arraylist == obj[k].arraylist) continue;
person Amin Abu-Taleb    schedule 05.09.2013
comment
Даже если он добавляет в другой список? Ум i и k должны быть не одинаковыми. Поэтому я предполагаю, что obj[i].arraylist и obj[k].arraylist тоже не являются одним и тем же экземпляром. - person Fildor; 05.09.2013
comment
@Fildor Вы уверены, что «i» и «k» действительно разные, но вы не можете предполагать, что массивы в obj[i] и obj[k] не являются одними и теми же объектами. - person Amin Abu-Taleb; 05.09.2013
comment
Если это так, то у нас обнаружен недостаток :) Кстати: он должен продолжаться, если экземпляры одинаковы одинаковы, поэтому должно быть obj[i].arraylist == obj[k].arraylist) , верно? - person Fildor; 05.09.2013

Вы можете изменить список только во время итерации, используя переменную it.

person WoooHaaaa    schedule 23.12.2013