2016-08-05 6 views
-7

Ich testete die next() und remove() Methoden der Iterator Schnittstelle. Ich habe die folgende Ausnahme:Warum verwendet der folgende Code mit Iterator next() und remove() ConcurrentModificationException?

Exception in thread "main" java.util.ConcurrentModificationException

Hier ist mein Code:

import java.util.*; 

public class ListTest { 
    public static void main(String[] args) { 
     Collection<Integer> list = new ArrayList<Integer>(); 
     Iterator<Integer> iterator = list.iterator(); 

     Collections.addAll(list, 1, 2, 3, 4, 5); 
     if (iterator.hasNext()) { 
      iterator.next(); 
      iterator.remove(); 
     } 

     System.out.println(list); 
    } 
} 
+0

Es ist wahrscheinlich besser, als Duplikat zu schließen, wie die hier Antworten absolut nichts über die Ausnahme zu erklären. –

+1

@ DenysSéguret Sie haben Recht, ich fügte weitere Details zu meiner Antwort zu erklären, ein wenig mehr –

+0

@NicolasFilotto * Jetzt * Sie beantworten die Frage :) –

Antwort

6

Es gibt kein Problem mit Ihrer Nutzung von Iteratornext() und remove().

Ihr ConcurrentModificationException wird durch Hinzufügen von Elementen zu List nach dem Erstellen der Iterator verursacht.

Sie sollten die Elemente List hinzufügen, bevor die Iterator erstellt wird.

Wechsel:

Iterator<Integer> iterator = list.iterator(); 
Collections.addAll(list, 1, 2, 3, 4, 5); 

zu:

Collections.addAll(list, 1, 2, 3, 4, 5); 
Iterator<Integer> iterator = list.iterator(); 

und Ihre Schleife wird gut funktionieren.

4

Sie diese Ausnahme erhalten, weil Sie die sate Ihrer List ändern, indem Elemente hinzuzufügen, nachdem Ihr Iterator so geschaffen zu haben, wenn Sie next() auf Ihrem Iterator rufen, intern überprüft, ob die zugrunde liegenden List modifiziert wurde, und wenn ja, wirft er eine ConcurrentModificationException Das ist hier der Fall.

Versuchen Sie, den Auftrag als neben Invers:

Collections.addAll(list, 1, 2, 3, 4, 5); 
Iterator<Integer> iterator = list.iterator();