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
> 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 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.
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]