Исключение одновременной модификации, созданное .next из Iterator - PullRequest
3 голосов
/ 12 февраля 2010

Не уверен, что именно здесь не так:

    while(itr.hasNext())
    {
        Stock temp =itr.next();

    }

Этот код вызывает исключение ConcurrentModificationException в itr.next ();

Инициализация для итератора private Iterator<Stock> itr=stockList.iterator();

Есть идеи?

[Основной код был скопирован непосредственно со слайдов профессора]

Ответы [ 3 ]

5 голосов
/ 12 февраля 2010

Это может происходить по двум причинам.

  1. Другой поток обновляет stockList либо напрямую, либо через его итератор
  2. В том же потоке, возможно, внутри самого циклаИзменен stockList (см. пример ниже)

Указанные ниже коды могут вызвать исключение ConcurrentModificationException

Iterator<Stock> itr = stockList.iterator();
 while(itr.hasNext()) 
    { 
        Stock temp = itr.next(); 

        stockList.add(new Stock()); // Causes ConcurrentModificationException 

        stockList.remove(0) //Causes ConcurrentModificationException 
    } 
1 голос
/ 12 февраля 2010

Какой-то другой поток модифицирует базовую коллекцию? Я подозреваю, что есть код над тем, что вы нам показываете, который вызывает проблему: мод для коллекции между вызовом iterator () и циклом.

0 голосов
/ 12 февраля 2010

Наиболее вероятная причина в том, что какой-то код изменил базовую коллекцию после того, как вы получили свой итератор.

Форма Javadoc :

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

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