2016-12-06 3 views
1
public static ArrayList<Job> ready = new ArrayList<Job>(); 
...later on.... 
ArrayList<Job> temp = ready; 
for (Iterator<Job> iterator = temp.iterator(); iterator.hasNext();) { 
    Job j = (Job) iterator.next(); 
    if (j.number == number) { 
     ready.remove(j); 
     ready.add(j); 
     system.devices-=devices; 
     j.devices+=devices; 
     iterator.remove(); 
    } 
} 

Зачем это ошибка? Конечно, ready = temp, но я повторяю temp, и я не изменяю temp. Как я могу обойти эту проблему?ConcurrentModificationException при использовании списка тем

+4

Вы пытаетесь изменить список во время повтора через него. 'temp' и' ready' - это один и тот же список - изменение одного изменяет другое. Если вы хотите * скопировать * список, вы можете сделать 'temp = new ArrayList (ready)'. – khelwood

+2

При публикации вопроса об исключении вы ДОЛЖНЫ включать полную трассировку стека исключений и идентифицировать строку в своем коде, которая генерирует исключение. –

+1

@khelwood Вы опубликовали свой комментарий в качестве ответа. –

ответ

-2

Вы изменяете список, добавление и удаление элементов в то время как вы итерацию над ней, не очень хорошая идея ...

вместо поместить те элементы, которые удовлетворяют условию

if (j.number == number) { 

в другом списке и сделать temp.removeAll(c);

1

temp является ссылкой на ready любые изменения в ready будут видны итератора temp. Вы можете использовать Collections.copy

ArrayList<Job> temp = new ArrayList<Job>(); 
Collections.copy(temp, ready); 
1

Вы пытаетесь изменить список, пока вы итерацию через него. temp и ready - это один и тот же список - смена одной изменяет другую. Если вы хотите копировать список, вы можете использовать temp = new ArrayList<Job>(ready).

0

Вы пытаетесь изменить коллекцию во время цикла, и этот не может поддерживать такую ​​операцию. У вас есть два разных решения: 1- Чтобы скопировать коллекцию в другую и создать цикл на основе одного и изменить другой. 2 Лучшая практика заключается в использовании параллельных коллекций, таких как: CopOnWriteArrayList, ConcurrentSkipListMap

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