Не изменяет список, но все еще получает исключение ConcurrentModificationException - PullRequest
3 голосов
/ 10 сентября 2010

Перед вашими глазами заглядывает еще один вопрос об ConcurrentModificationException, это не ваш типичный вопрос об ConcurrentModificationException.

Я понимаю исключения ConcurrentModificationExceptions, но не понимаю, почему я получаю один в следующем коде. В 'for' ниже, кажется, что итератор продолжает жить вне цикла for. (Используя отладчик в eclipse, я вижу, что итератор сохраняет свое значение modCount в jList при перезапуске цикла.)

public class ForEachTest {
  public static void main(String[] args) {
    List<Integer> zList = new LinkedList<Integer>();
    List<Integer> jList = new LinkedList<Integer>();
    jList.add(1);

    while (true) {
      for (Integer j : jList) {
        zList.add(17);
        System.out.println(j);
      }
      jList = zList;
    }
  }
}

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

Наконец, я смог переписать его, разделив for на некоторое время с помощью отдельного шага инициализации, поэтому я не ищу переписать просто для того, чтобы заставить его работать. Но я хотел бы знать, в чем проблема с тем, как это показано здесь. Я бы предпочел использовать синтаксис for-each, если это возможно.

1 Ответ

19 голосов
/ 10 сентября 2010

Посмотрите на ваш цикл:

while (true) {
  for (Integer j : jList) {
    zList.add(17);
    System.out.println(j);
  }
  jList = zList;
}

На второй итерации внешнего цикла jList и zList ссылаются на один и тот же список (из-за оператора jList = zList;) ...поэтому, когда вы добавляете к zList внутри вашего внутреннего цикла, вы изменяете список, по которому вы перебираете.Взрыва.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...