2016-01-16 2 views
1

в моей программе Я создал команды (например, футбол), и теперь я хочу создать метод, в котором каждая команда будет играть против всех других команд. Мой метод генерирует исключение ConcurrentModificationException. Вот оно:Избегайте ConcurrentModificationException при использовании вложенных for-loops в Java

public void playMatches(){ 
    for (Team team : mTeams) { 
     mTeams.remove(team); 
     for (Team team1 : mTeams) { 
      match(team, team1); 
     } 
     mTeams.add(team); 
    } 
} 

Я удаляю команде себя от mTeams, так что он не играет против себя, но это бросает исключение. Как я могу справиться с этим?

+2

Возможный дубликат [Итерирование по списку, исключение ConcurrentModificationException при удалении в цикле] (http://stackoverflow.com/questions/223918/iterating-through-a-list-avoiding-concurrentmodificationexception- при удалении) – Turing85

+0

@ Turing85 Это не очень хороший дубликат, потому что OP может полностью избежать модификаций, вместо того, чтобы делать изменения. – dasblinkenlight

+1

Это не дублирование. Он также добавляет элементы в список. Не только удалить их. –

ответ

3

Так как вы, кажется, понимают, что нарушение, давайте рассмотрим «, как обрабатывать "часть вашего вопроса. Хорошая новость заключается в том, что вам не нужно вообще изменять свою коллекцию.

Вместо того, чтобы модифицировать коллекцию путем удаления и последующего добавления элемента, пропустить команду из внешнего цикла при вызове match во внутреннем цикле, как это:

for (Team team : mTeams) { 
    for (Team team1 : mTeams) { 
     if (team.equals(team1)) continue; 
     match(team, team1); 
    } 
} 
+0

Возможно, это хороший ответ, но он не уверен, что не знает, что такое матч. В любом случае, я думаю, что я могу добавить свой +1 –

0

A ConcurrentModificationException вызывается при попытке изменить Collection во время итерации по нему и без использования метода удаления итератора.

Когда используется синтаксис

for (Team team : mTeams) { 

итератор создан для вас.

Если вам нравится удалять элементы из вашего кода, вам явно нужно перебирать итератор, или вам нужно использовать цикл, используя старый стиль для цикла. Например

for (int i = 0; i < mTeams.size(); i++) { 

    // Here you can use add and remove on the list without problems 
} 

или (но не полезно здесь, потому что вам нужно также добавлять элементы, а не только удалять их)

Iterator<Team> iterator = mTeams.iterator(); 
while (iterator.hasNext()) { 
    Team team = iterator.next()); 
    // Here you can use iterator.remove but you can't add 
} 
0

вы не можете сделать структурные (add/remove) изменения в списке при повторении. он выкинет ConcurrentModificationException. Использовать итератор для удаления или добавления

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