Datentypen ConcurrentModificationException

Appleleptiker

Mitglied
Hallo Leute, hier erstmal ein knapper Source Code zur Einleitung:

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?
 

eRaaaa

Top Contributor
Naja, verbieten kann dir natürlich niemand etwas :D

Aber du hast es schon richtig verstanden, sobald du dir den Iterator holst(was auch foreach intenr macht) wird die Collection gesperrt, und wenn du dann mit Methoden der Collection Elemente löschst, wird eben die Exception geworfen beim nächsten next()
Wenn man weiß was man da tut und trotzdem eben die Elemente löschen will, kann man das eben so mache wie in deinem Code, indem man eben remove nicht direkt auf der Collection aufruft, also eben nicht list.remove(..) sondern über den Iterator (it.remove()).
 

Appleleptiker

Mitglied
Ah Ok. Jetzt sehe ichs. Hatte erwartet, Eclipse meckert wegen falscher Klammern. Hätte da als letztes nachgesehen.

P.S.: Jetzt sehe ich auch, dass die Schleife algorithmisch eher suboptimal ist :). Danke für Eure Hilfe.
 
Zuletzt bearbeitet:

eRaaaa

Top Contributor
Doch, der Iterator wird doch bei for (String item : list) {
erstellt... und das list.remove wird nun innerhalb diesen Blockes getätigt....wie gesagt, das geht nicht!
Daher müsstest du eben nicht die for-each benutzen(die verstekct den Iterator) sondenr eben dir den Iterator holen und dann deren remove-Methode aufrufen!
Man muss auch nicht unbedingt eine while-Schleife für den Iterator benutzen, finde for auch viel besser
Java:
		for (Iterator<String> iterator = list.iterator(); iterator.hasNext();) {
			
		}

und dann eben nicht list.remove, sondern iterator.remove..
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException Java Basics - Anfänger-Themen 8
temi ConcurrentModificationException Java Basics - Anfänger-Themen 32
C ConcurrentModificationException Java Basics - Anfänger-Themen 3
K Collections ConcurrentModificationException Java Basics - Anfänger-Themen 3
F Collections ConcurrentModificationException in ArrayList, mehrere Threads Java Basics - Anfänger-Themen 7
S ConcurrentModificationException Java Basics - Anfänger-Themen 4
H ConcurrentModificationException in HashMap Java Basics - Anfänger-Themen 2
Luk10 ConcurrentModificationException Java Basics - Anfänger-Themen 35
Luk10 ConcurrentModificationException Java Basics - Anfänger-Themen 15
H ConcurrentModificationException Java Basics - Anfänger-Themen 11
K java.util.ConcurrentModificationException problem in der Logik? Quaxli-Tutorial Java Basics - Anfänger-Themen 9
T ConcurrentModificationException bei HashMap Operation Java Basics - Anfänger-Themen 2
E java.util.ConcurrentModificationException Problem Java Basics - Anfänger-Themen 5
F java.util.ConcurrentModificationException Java Basics - Anfänger-Themen 8
S ArrayList ConcurrentModificationException Java Basics - Anfänger-Themen 4
J ConcurrentModificationException finden Java Basics - Anfänger-Themen 2
cowabunga1984 Objek löschen -> ConcurrentModificationException Java Basics - Anfänger-Themen 7
N removeAll und ConcurrentModificationException Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben