1 Востаннє редагувалося vector9 (08.08.2015 16:55:38)

Тема: Проблемка з ітератором

код нижче видає ConcurrentModificationException на 22 рядку при виклику ф-ції next()

Прихований текст
import java.util.ArrayList;
import java.util.Iterator;

class Sequence {
  private ArrayList<Object> items = new ArrayList<Object>();
  public void add(Object x) {
      items.add(x);
  }
  private Iterator<Object> iter = items.iterator();
  public Iterator<Object> iterator(){
    return iter;
  }
}
class c1{
  public static void main(String[] args) {
    Sequence sequence = new Sequence();
    for(int i = 0; i < 10; i++)
      sequence.add(Integer.toString(i));
    Iterator<Object> iterator = sequence.iterator();

    while(iterator.hasNext()) {
      System.out.print(iterator.next() + " ");
    }
  }
}

змінюю лиш кусок коду

private Iterator<Object> iter = items.iterator();
  public Iterator<Object> iterator(){
    return iter;
  }

на

    public Iterator<Object> iterator(){
        return items.iterator();
    }

В виправленому коді  повертаю кожен раз новий ітератор, я розумію, що так в принципі має бути за правилами, але не розумію в чому тоді моя помилка.

Код який працює

Прихований текст
import java.util.ArrayList;
import java.util.Iterator;

class Sequence {
    private ArrayList<Object> items = new ArrayList<Object>();
    public void add(Object x) {
        items.add(x);
    }
    public Iterator<Object> iterator(){
        return items.iterator();
    }
}
class c1{
    public static void main(String[] args) {
        Sequence sequence = new Sequence();
        for(int i = 0; i < 10; i++)
            sequence.add(Integer.toString(i));
        Iterator<Object> iterator = sequence.iterator();

        while(iterator.hasNext()) {
            System.out.print(iterator.next() + " ");
        }
    }
}

2

Re: Проблемка з ітератором

Модифікація колекції робить ітератор некоректним. Ви отримуєте iter в той момент, коли items пустий, а потім додаєте елементи в колекцію - і маєте проблему.

Подякували: vector91

3 Востаннє редагувалося hotHead (30.09.2015 09:02:58)

Re: Проблемка з ітератором

повтикайте ще на це
http://docs.oracle.com/javase/7/docs/ap … rator.html
тут ще декілька іксепшинів приведено, які можуть виникнути

а взагалі пан koala істину глаголить: якщо витягнули ітератор і після цього робите модифікації з колекцією(додаєте або видаляєте елемент(и)) методами колекції, а не ітератора то в більшості випадків виникне ConcurrentModificationException, якщо ви спробуєте надалі працювати з цим ітератором
Більшість ітераторів є fail-fast (клік на ссилочку)

http://www.jguru.com/faq/view.jsp?EID=221988