2015-06-26 5 views
0

Мне нужно рекурсивно удалять элементы из списка, но даже при применении итератора к копии объекта, я получаю ошибку сопутствующей модификации.java итератор одновременной модификации даже с предосторожностями

List<Referee> referees=videogame.getGamers(); 
Iterator<Referee> iter= referees.iterator(); 

while(iter.hasNext()){ 
    Referee ref= iter.next(); 
    if(ref.getTheGameIsOver()) 
    videogame.removeReferee(ref); 
} 
+0

Что 'removeReferee' делать? Удаляет ли он из того же 'List', что' getGamers' возвращает и итерируется на 'iter'? –

+0

Возможный дубликат [Вызов удаления в цикле foreach в Java] (http://stackoverflow.com/questions/1196586/calling-remove-in-foreach-loop-in-java) – Danielson

+0

Или при использовании Java 8: 'видеоигры. getGamers() removeIf (судья :: getTheGameIsOver). '... – Holger

ответ

2

Вы изменяете базовую коллекцию, в то время как Iterator выполняет итерацию по ней. Именно это вызывает ConcurrentModificationException.

Вместо этого позвоните по телефону remove() по адресу Iterator. Он удаляет последний итерационный элемент, вызывая это исключение. Заменить

videogame.removeReferee(ref); 

с

iter.remove(); 
1

Правильный способ использования будет ниже, и это имеет смысл, потому что объект итератор знает, где он находится в списке, поскольку список осуществляется переход.

List<Referee> referees=videogame.getGamers(); 
Iterator<Referee> iter= referees.iterator(); 

while(iter.hasNext()){ 
    Referee ref= iter.next(); 
    if(ref.getTheGameIsOver()) 
    iter.remove() 
} 

Пожалуйста, обратитесь http://durgaprasadtechie.blogspot.com/2011/07/concurrentmodificationexception-fail.html