2010-09-10 2 views
3

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

Я понимаю ConcurrentModificationExceptions, но я не понимаю, почему я получаю его в следующем коде. В «for» ниже показано, что итератор продолжает жить вне цикла for. (С помощью отладчика в затмении, я могу видеть, что итератор сохраняет свое значение 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-each, если это возможно.

+0

Обратите внимание, что мой ответ объясняет, почему это происходит (это * ваш * типичный вопрос ConcurrentModificationException, в основном), но вы не объяснили, что вы пытаетесь сделать, поэтому я не смог предложить альтернативу. –

ответ

19

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

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

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

+0

Побей меня ... Я только что закончил набирать свой ответ ... + 1. –

+0

+1 за то, что он прав - хорошая работа, Джон Скит. –

+0

Это заслуживает того, чтобы его приняли. Вы ничего не могли бы добавить к этому. – serg10

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