Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

ConcurrentModificationException bei foreach LinkedList?

0 views
Skip to first unread message

Frank Buss

unread,
May 14, 2006, 5:30:47 AM5/14/06
to
Falls das eine FAQ ist, dann bitte folgende Frage, wegen überraschendem
Verhalten, als Beschwerde an Sun verstehen :-)

Warum wirft dieser Code eine Excpetion?

LinkedList<Integer>list = new LinkedList<Integer>();
list.addFirst(new Integer(1));
list.addFirst(new Integer(2));
list.addFirst(new Integer(3));
for (Integer element : list) {
System.out.println(element);
}

Es kommt folgende Ausgabe:

3
2
1
Exception in thread "main" java.util.ConcurrentModificationException
at
java.util.LinkedList$ListItr.checkForComodification(LinkedList.java:617)

--
Frank Buss, f...@frank-buss.de
http://www.frank-buss.de, http://www.it4-systems.de

Stefan Matthias Aust

unread,
May 14, 2006, 5:34:59 AM5/14/06
to
Frank Buss schrieb:

> Warum wirft dieser Code eine Excpetion? [...]

Tut er bei mir (1.6 b84) nicht.

--
Stefan Matthias Aust // Ergo bibamus, ne sitiamus, vas repleamus!

Frank Buss

unread,
May 14, 2006, 5:51:51 AM5/14/06
to
Stefan Matthias Aust wrote:

> Frank Buss schrieb:
>
>> Warum wirft dieser Code eine Excpetion? [...]
>
> Tut er bei mir (1.6 b84) nicht.

Stimmt, war nur ein Programiererfehler: Ich hatte den Test eben am Anfang
des Quiz-Programms geschrieben, um was kurzes reproduzierbares zu haben,
aber der Fehler kam später (hatte das Programm nach dem Testfall nicht
beendet), weil ich durch einen Programmfehler während des Iterierens
Elemente hinzugefügt hatte.

In Lisp wäre das z.B. möglich:

(let ((list (copy-seq '(1 2 3))))
(loop for i in list do
(format t "~a~%" i)
(when (= i 2)
(nconc list '(4 5)))))

1
2
3
4
5

wobei ich mir aber nicht sicher bin, ob das nur zufällig so funktioniert
oder vom ANSI-Standard auch so vorgesehen ist.

Wanja Gayk

unread,
May 14, 2006, 7:59:27 AM5/14/06
to
f...@frank-buss.de said...

> Falls das eine FAQ ist, dann bitte folgende Frage, wegen überraschendem
> Verhalten, als Beschwerde an Sun verstehen :-)

for(final Object o : collection){
//..
}

ist das selbe wie:

Iterator i = collection.iterator();
while(i.hasNext()){
final Object o = i.next();
//...
}

Denn die foreach-Schleife geht immer über den Iterator und der iterator
sichert gegen concurrent modification ab.

siehe auch:

| II. Syntax
| The following description is not up to JLS standards, but should be
| good enough for present purposes. The new form of the for statement is
| governed by the following production:
|
| EnhancedForStatement:
| for ( Type Identifier : Expression )
| Statement
| Expression must be an instance of a new interface called
| java.lang.Iterable, or an array. The interface java.util.Collection
| (and perhaps a few other interfaces or classes) will be retrofitted to
| extend (or implement) java.lang.Iterable

Quelle:
> http://www.jcp.org/aboutJava/communityprocess/jsr/tiger/enhanced-for.html <

Gruß,
-Wanja-

--
"Gewisse Schriftsteller sagen von ihren Werken immer: 'Mein Buch, mein
Kommentar, meine Geschichte'. [..] Es wäre besser, wenn sie sagten:
'unser Buch, unser Kommentar, unsere Geschichte'; wenn man bedenkt, dass
das Gute darin mehr von anderen ist als von ihnen." [Blaise Pascal]

0 new messages