Hallo Leute, hier erstmal ein knapper Source Code zur Einleitung:
Ich bitte Euch, kurz mal einen Blick auf die Methode remove5List(List<String> list) zu werfen. Dort werden alle Zahlen aus der Liste geschmissen, die durch 5 teilbar sind. Dabei wird ein Iterator verwendet, der über die Liste iteriert.
Jetzt sagt Oracle in seiner JavaDoc zum Thema ConcurrentModificationException:
Kurz gesagt: Solange ein Thread über eine Liste iteriert, sind Veränderungen an der Liste nicht erlaubt. Korrigiert mich, wenn ich das missverstehe.
Jetzt wundere ich mich, da in der remove5List-Methode genau das getan wird, was Oracle als Auslöser für die Exception nennt. Bitte auch hier korrigieren, wenn ich das missverstehe.
Ich habe eine andere Methode (meine eigene Lösung, nachdem foreach über die Liste mit einem remove nicht geklappt hatte) geschrieben, die die Indizes der durch 5 teilbaren Zahlen erst aufsucht, diese speichert und erst danach das Löschen durchführt.
Nur leider wirft diese Methode genau die Excpetion, die die Obere eigentlich auslösen sollte.
Wo liegt der Fehler?
Java:
import java.util.*;
public class ListInterfaceAufgabe
{
//Elemente in Liste einf¸gen
static void fillList(List<String> list)
{
//Zahlen von 0 bis 20 als Zeichenketten (Strings) einf¸gen
for (int i = 0; i < 21; ++i)
{
list.add("" + i);
}
//Element an der Position 3 entfernen
list.remove(3);
//Erstes Element in der Liste entfernen, das gleich "6" ist
list.remove("6");
}
//Liste vom Anfang bis zum Ende durchlaufen und Elemente ausgeben
//Durchlauf mit foreach-Schleife!
static void printList(List<String> list)
{
for (String item : list) {
System.out.println(item);
}
}
//Alle Elemente aus der Liste entfernen, die Ñdurch 5 teilbarì sind
static void remove5List(List<String> list)
{
ListIterator<String> it = list.listIterator();
while (it.hasNext()) {
String s; s = it.next();
if ((s.endsWith("0") || s.endsWith("5")) && !s.equals("0")) {
it.remove();
}
}
}
public static void main(String[] args)
{
//Erzeugen der LinkedList
LinkedList<String> list1 = new LinkedList<String>();
fillList(list1);
System.out.println("\nAusgabe der ersten Liste(list1)");
printList(list1);
remove5List(list1);
System.out.println("\nlist1 nach dem Entfernen der durch 5 teilbaren Zahlen");
printList(list1);
//Erzeugen der ArrayList
ArrayList<String> list2 = new ArrayList<String>();
fillList(list2);
System.out.println("\nAusgabe der zweiten Liste(list2)");
printList(list2);
// ToDO
}
}
Ich bitte Euch, kurz mal einen Blick auf die Methode remove5List(List<String> list) zu werfen. Dort werden alle Zahlen aus der Liste geschmissen, die durch 5 teilbar sind. Dabei wird ein Iterator verwendet, der über die Liste iteriert.
Jetzt sagt Oracle in seiner JavaDoc zum Thema ConcurrentModificationException:
For example, it is not generally permissible for one thread to modify a Collection while another thread is iterating over it. In general, the results of the iteration are undefined under these circumstances. Some Iterator implementations (including those of all the general purpose collection implementations provided by the JRE) may choose to throw this exception if this behavior is detected. Iterators that do this are known as fail-fast iterators, as they fail quickly and cleanly, rather that risking arbitrary, non-deterministic behavior at an undetermined time in the future.
Kurz gesagt: Solange ein Thread über eine Liste iteriert, sind Veränderungen an der Liste nicht erlaubt. Korrigiert mich, wenn ich das missverstehe.
Jetzt wundere ich mich, da in der remove5List-Methode genau das getan wird, was Oracle als Auslöser für die Exception nennt. Bitte auch hier korrigieren, wenn ich das missverstehe.
Ich habe eine andere Methode (meine eigene Lösung, nachdem foreach über die Liste mit einem remove nicht geklappt hatte) geschrieben, die die Indizes der durch 5 teilbaren Zahlen erst aufsucht, diese speichert und erst danach das Löschen durchführt.
Java:
int toDel[] = new int[list.size()/5];
int i = 0;
for (String item : list) {
try {
if(Integer.parseInt(item) != 0 && Integer.parseInt(item) % 5 == 0) {
toDel[i] = list.indexOf(item);
System.out.println("" + item + " ist durch 5 teilbar. Index: " + toDel[i]);
if(i < toDel.length-1)
i++;
}
}
catch(NumberFormatException e) {
System.out.println("Listenelement enthielt keine Zahl.");
}
i = 0;
while(i < toDel.length) {
list.remove(toDel[i]);
i++;
}
}
Nur leider wirft diese Methode genau die Excpetion, die die Obere eigentlich auslösen sollte.
Wo liegt der Fehler?