ConcurrentModificationException - PullRequest
       16

ConcurrentModificationException

1 голос
/ 22 июля 2011

С помощью приведенного ниже фрагмента я пытаюсь обработать электронную таблицу, но с необходимостью исключить специальные столбцы. Я знаю грубый способ, которым я делаю это, помещаю исключения в ArrayList и обрабатываю список для каждого и каждого приращения по столбцам текущей строки, извращенно, но вы знаете, просто сделайте это.

Однако я получаю названную ошибку, которая, по моему мнению, никогда не должна произойти. Я просто перебираю ArrayList и сравниваю, ничего не изменяя. Где ошибка? Есть ли лучший способ обработать список исключений?

ArrayList noProcess = new ArrayList();
Iterator itr00 = noProcess.iterator();
Iterator itr01 = noProcess.iterator();
noProcess.add(new Integer("5"));
noProcess.add(new Integer("18"));
....
 boolean include=true;
  for(int i=0;i<archive.length;i++){
    for (int j = 0; j < archive[i].length; j++) {
      while (itr00.hasNext()) {
        if (j == ( (Integer) itr00.next()).intValue())
          include = false;
      }
      if (include) {...

Ответы [ 4 ]

4 голосов
/ 22 июля 2011

Вы не можете изменить содержимое Iterable после создания на нем итератора (кроме как через итератор), в противном случае вы получите исключение ConcurrentModificationException, как только вы переместите итератор - вы создадите итератор, затем выполните noProcess.add(new Integer("5"));, а затем продвиньте итератор.

Кроме того, вы создаете двух итераторов - вы тоже не должны этого делать - это безумие.

1 голос
/ 22 июля 2011

Из документов Java:

Итераторы, возвращаемые итераторами этого класса и listIterator методы работают быстро: если список структурно изменен время после создания итератора, любым способом, кроме как через собственные методы удаления или добавления итератора, итератор выдаст ConcurrentModificationException. Таким образом, перед лицом одновременного модификация, итератор дает сбой быстро и чисто, а не риск произвольного, недетерминированного поведения в неопределенное время в будущем.

Используйте метод add итератора для добавления элемента в список

1 голос
/ 22 июля 2011

Из JavaDoc ,

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

E.g как правило, один поток не может модифицировать коллекцию, пока другой поток итерирует по ней.

0 голосов
/ 22 июля 2011

Добавляя записи в список после получения итератора, исправьте это .. тогда оно должно работать.

...