java.util.ConcurrentModificationException Problem

Status
Nicht offen für weitere Antworten.
E

Emerix

Gast
Schönen guten Tag !
Ich muss als Hausaufgabe ein Java Programm schreiben , weches die Graphische Darstellung von Automaten "repräsentiert".
Dazu gehört , dass man einen Automaten in einen deterministischen umformt
Ein Automat besteht aus Knoten und Kanten. Zu jeder kante gehört ein Von Knoten und ein Zu Knoten und ein array von Zeichen. Bei Eingabe eines dieser Zeichen kommt man vom Von Knoten zum Zu Knoten.
In einem deterministischen Automaten gibt es bei Eingabe von einem Zeichen genau einen Folgeknoten. Bei nichtdeterministischen ogischerweise manchmal auch mehrere.
Das Prinzip aus dem diese Methode beruht ist , um einen Automaten deterministisch zu machen wird die Menge der Folgeknoten , die man mit einem Zeichen erreicht zu einem neuen Knoten zusammen gefasst. Dann wird vom eben betrachteten Knoten zum neuen eine Kante mit nur einem Zeichen erstellt.
Von allen so erstellten Knoten wird das gleiche nochmals durchgeführt um am Ende einen deterministischen Automaten zu haben. Wenn man eine Menge von Knoten bereits einmal "heraus bekommen" hat, und somit bereits ein passender Zustand b erstellt wurde, dann wird vom betrachteten Knoten mit dem betrachteten Zeichen eine kante zum knoten b erstellt.

Auf dem papier ganz einfach aber als java code bekomm ich es einfach nicht gerafft, da irrgendwann der Fehler

Exception in thread "main" java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextEntry(Unknown Source)
at java.util.HashMap$KeyIterator.next(Unknown Source)
at AutomatBib.Automat.makeDeterm(Automat.java:281)
at AutomatBib.Oberflaeche.makeDeterm(Oberflaeche.java:69)
at AutomatBib.TestAutomaton.main(TestAutomaton.java:122)

auftaucht.
Bei google stand , dass dies geschieht , wenn man über eine Collection einen iterator laufen lässt und die collection ändern möchte. Allerdings wird der Fehler hier bei der zeile..

Code:
while(it.hasNext()==true){
					Node2 n=it.next();
					//hier kommt es zur exception

also bei it.next(); geworfen. Und das erst, wenn die while schleife bereits mehrmals durchlaufen wurde.
Ich bin doch sehr am verzweifeln hehe.

Ich nutze übrigens Eclipse und die neueste Java Version.

Wäre sehr erfreut über andere Lösungsansätze, da ich schon 4 mal versucht habe diese Methode von Grund auf neu zu coden und es einfach nicht hinbekomme (wegen diesem fehler)



Code:
public Automat makeDeterm(){
		
		//wenn automat deterministisch gib ihn wieder...
		if(this.isDeterm()==true){
			return this;
		}
		else{
			
			//neuer automat der nachher wiedergegeben wird
			Automat a=new Automat(sigma);
			HashSet<Node2> hash=new HashSet<Node2>();
			//set von (mengen von)knoten , die vom startknoten des zu bearbeitenden automaten
			//angesprochen werden
			for(int i=0;i<sigma.length;i++){
				char[] ca=new char[1];
				ca[0]=sigma[i];
				//umformung des jetzt benutzen char in ein einelementiges array
				//um nachher weitere edges erstellen zu können
				HashSet<Node> baum=anfang.gebeTreeBeiZeichen(sigma[i]);
				//menge von knoten die bei zeichen sigma[i] angesprochenw erden
				if((baum.size()==1)&&(baum.contains(anfang))){
					a.addEdge(a.anfang,ca,a.anfang);
				}
				//falls nur der erste knoten angesprochen wird wird eine kante vom anfang des
				//neuen automaten und zurück erstellt. Bei weiteren knoten vom anfang zum anfang
				//wird jeder neue knoten gemerged.. also bleibt nur ein knoten aber die liste
				//der zeichen dieses knotens wird erweitert.
				else{
					
					Node2 n=new Node2(baum);
					Iterator<Node2> iter=hash.iterator();
					
					boolean check=false;
					while(iter.hasNext()){
						Node2 node=iter.next();
						if((node.nodes.containsAll(baum)&&baum.containsAll(node.nodes))==true){
							check=true;
							a.addEdge(a.anfang,ca, node);
						}
					}
					//hier wird überprüft ob es bereits einen knoten gibts , der die gleiche
					//menge von knoten aus dem anfangsautomaten repräsentiert
					//wenn ja wirdkein neuer zustand erstellt
					
					if(check==false){
						hash.add(n);
						a.addNode(n);
						a.addEdge(a.anfang,ca,n);
						//wenn nicht wird hier ein neuer knoten erstellt.. und dieser in hash gemerkt
						//ein automat merkt sich alle seine zustände als node
						//nodes haben allerdings nicht das hashset kanten als attribut
						//in welchen die menge der kanten gespeichert wird die sie repräsentiert
					}
				}
			}
			
			boolean crash=true;
			//die variable die zum abbruch der schleife unten führt . wird false wenn
			// keine weiteren sets übergeben werden und somit der "umbau" abgeschlossen ist
			HashSet<Node2> nodes=new HashSet<Node2>();
			//da der erste schritt von der anfangskante fertig ist werden nun alle node2's
			//in einem neuen set gespeichert
			HashSet<Node2> treeNext=new HashSet<Node2>();
			//in dieses set werden alle , für den nächsten schleiendurchgang benötigten
			// node2's gespeichert
			nodes.addAll(hash);
			//hash wird kopiert..
			System.out.println(nodes);
			
			while(crash){
				Iterator<Node2> it=hash.iterator();
				//iterator zur schleife über alle zuletzt erstellten nodes
				while(it.hasNext()==true){
					Node2 n=it.next();
					//hier kommt es zur exception
					for(int i=0;i<sigma.length;i++){
						char[] ca=new char[1];
						ca[0]=sigma[i];
						HashSet<Node> tree=n.gebeTreeBeiZeichen2(sigma[i]);
						if(tree.size()==1&&tree.contains(anfang)){
							a.addEdge(n,ca,a.anfang);
						}
						else{
							Iterator<Node2> itNodes=nodes.iterator();
							boolean meh=false;
							while(itNodes.hasNext()){
								Node2 nodeCheck=itNodes.next();
								if((nodeCheck.nodes.containsAll(tree))&&(tree.containsAll(nodeCheck.nodes))){
									a.addEdge(n,ca,nodeCheck);
									meh=true;
								}
							}
							
							if(meh==false){
								
								System.out.println("Meh");
								Node2 neu=new Node2(tree);
								
								a.addNode(neu);//fügt dem automaten den neuen knoten zu
								a.addEdge(n,ca,neu);//fügt dem automaten die neue kante zu
								nodes.add(neu);//fügt dem hilfsset von zuständen den neuen zu
								treeNext.add(neu);
								//fügt dem set der knoten welche als nächstes bearbeitet werden müssen
								//diesen neuen knoten hinzu
							}
						}
					}
				}
				
				hash=treeNext;
				//das alte set wird mit dem neuen ersetzt
				if(hash.size()==0){
					//wenn das neue set leer sein sollte wird crash =false gesetzt und die schleife 
					//ist vollendet
					crash=false;
				}
			}
			Iterator<Node2> it =nodes.iterator();
			while(it.hasNext()){
				//setzten der akzeptanzzustände
				boolean check=false;
				Node2 n=it.next();
				Iterator<Node> ite=n.nodes.iterator();
				while(ite.hasNext()){
					Node na=ite.next();
					if(na.isF==true){
						check=true;
					}
				}
				if(check=true){
					n.makeF();
				}
			}
			return a;
		}
		
	}


Ich schicke übrigens gern den gesammten Source code weiter , wenn ihr selbst spielen wollt=)
Vielen Dank fürs Lesen![/code]
 
S

SlaterB

Gast
während du mit einem Iterator das HashSet hash durchläufst, darst du nichts neues einfügen,
z.B. Zeile 47 hash.add(n);


musst dir neue Elemente irgendwo anders zwischenspeichern und am Ende übertragen
oder den Iterator an einem kopieren HashSet aufrufen
oder was auch immer

edit: mist, so schnell und dann falsch, Zeile 47 liegt ja gar nicht innerhalb eines Iterator-Durchlaufs, oder?
bei welchem Befehl genau kommt die Exception? sind ja diverse Iterator-Schleifen in dem Code

edit2: verwende testweise eine Subklasse von HashSet, überschreibe dort die wichtigen Methoden und logge so mit System.out.println(),
wann iterator(), add() usw. aufgerufen werden
 
E

Emerix

Gast
Die Exception tritt bei Zeile 75 auf .
Ich erstelle ja bereits ein neues set names treeNext erstellt in welches ich die Knoten , welche als nächstes bearbeitet werden sollen Abspeicher und , wenn ich nicht total auf dem Schlauch stehe , dann füge ich auch in kein Set etwas ein während ich darüber iterieren lasse.

was genau meinst du mit
edit2: verwende testweise eine Subklasse von HashSet, überschreibe dort die wichtigen Methoden und logge so mit System.out.println(),
wann iterator(), add() usw. aufgerufen werden

Soll ich eine Klasse erstellen , die Subklasse von HashSet ist ?
Also in etwa:
Code:
package AutomatBib;
import java.util.*;
public class HashSet2<T> extends HashSet<T> {
	protected HashSet<T> set;
	public HashSet2(){
		
		set=new HashSet<T>();
		
	}
	public Iterator<T> iterator(){
		System.out.println("Made Iterator");
		return set.iterator();
	}
	public boolean add(T t){
		System.out.println("Added Item");
		return set.add(t);
	}
}
 
S

SlaterB

Gast
genau, damit könntest du nun loggen, wann wo was eingefügt wird, besonders wenn man noch dazuschreibt, wer der Aufrufer war (Klasse + Zeilennummer)

aber komplizierte Fehler sind damit auch nicht leicht zu finden, ich glaube ihn nun gesehen zu haben:

in Zeile 64 erzeugst du
> HashSet<Node2> treeNext=new HashSet<Node2>();

nach dem ersten Durchlauf von Zeile 74 while(it.hasNext()==true){
wird dann in Zeile 111 hash auf treeNext gesetzt:
> hash=treeNext;

damit ist hash nun treeNext,
im nächsten Durchlauf rufst du quasi treeNext.iterator() auf und schließlich in Zeile 103
> treeNext.add(neu);


wahrscheinlich musst du irgendwo treeNext ein neues HashSet zuweisen
 
E

Emerix

Gast
SlaterB hat gesagt.:
genau, damit könntest du nun loggen, wann wo was eingefügt wird,
aber komplizierte Fehler sind damit auch nicht leicht zu finden, ich glaube ihn nun gesehen zu haben:

in Zeile 64 erzeugst du
> HashSet<Node2> treeNext=new HashSet<Node2>();

nach dem ersten Durchlauf von Zeile 74 while(it.hasNext()==true){
wird dann in Zeile 111 hash auf treeNext gesetzt:
> hash=treeNext;

damit ist hash nun treeNext,
im nächsten Durchlauf rufst du quasi treeNext.iterator() auf und schließlich in Zeile 103
> treeNext.add(neu);


wahrscheinlich musst du irgendwo treeNext ein neues HashSet zuweisen


Oh mein Gott.. Das wars !
Hah ich Dussel..
Herzlichen Dank dir !
for(int i=0;i<unendlich;i++){System.out.println("Danke");}

Hehehe solche Fehler passieren mir immer wieder. Danke nochmal =)
 
E

Emerix

Gast
Da ich natürlich zu dämlich war mich zu registrieren bitte ich einen Mod doch dieses Problem als gelöst zu markieren=)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException Java Basics - Anfänger-Themen 8
K java.util.ConcurrentModificationException problem in der Logik? Quaxli-Tutorial Java Basics - Anfänger-Themen 9
F java.util.ConcurrentModificationException Java Basics - Anfänger-Themen 8
"java.util.HashMap.get(Object)" is null Java Basics - Anfänger-Themen 10
BATMAN_2008 Jackson adding additional fields to JSON throws java.util.concurrent.CompletionException: Java Basics - Anfänger-Themen 2
R java.util.Set, CASE_INSENSITIVE_ORDER Java Basics - Anfänger-Themen 6
M Exception in thread "main" java.util.NoSuchElementException Java Basics - Anfänger-Themen 2
F Erste Schritte java.util.Scanner: Beliebig langen Text per Paste in Console eingeben ? Java Basics - Anfänger-Themen 14
N java.util.InputMismatchException Fehler Java Scanner Java Basics - Anfänger-Themen 5
C java.util Timer läuft zu langsam? Java Basics - Anfänger-Themen 1
L Zufälliges Objekt aus der ArraylList ohne java.util.Random Java Basics - Anfänger-Themen 56
A Java.util.Arrays Java Basics - Anfänger-Themen 15
F java.util.ArrayList Java Basics - Anfänger-Themen 3
B java.util.Date noch zeitgemäß? Java Basics - Anfänger-Themen 6
B java.util.Date berechnen Java Basics - Anfänger-Themen 11
M java.util.scanner Fehler Java Basics - Anfänger-Themen 5
Meeresgott OOP Richtig mit java.util.Property umgehen Java Basics - Anfänger-Themen 22
N java.util.Random - Zwei Zahlen mit festgesetzter Wahrscheinlichkeit? Java Basics - Anfänger-Themen 15
A Vererbungshierachie und java.util.Date Java Basics - Anfänger-Themen 31
W Erste Schritte import java.util.scanner funktioniert nicht Java Basics - Anfänger-Themen 2
I google java-diff-util - Patch abspeichern Java Basics - Anfänger-Themen 1
G Interface java.util.Comparator: Wieso muss nur die Methode compare() implementiert werden Java Basics - Anfänger-Themen 2
H Repräsentation von DateTime (Joda) in Java Util Date überführen Java Basics - Anfänger-Themen 3
P Variablen Abfangen von eingaben per java.util.Scanner und weiter Verarbeitung Java Basics - Anfänger-Themen 7
D java.util.NoSuchElementException: No line found Java Basics - Anfänger-Themen 11
D Lesen aus Datei (java.util.NoSuchElementException) Java Basics - Anfänger-Themen 22
S Compiler-Fehler Scanner java.util NoSuchElementExeption Java Basics - Anfänger-Themen 8
W Methoden Rückgabedatentyp java.util.Map<java.lang.String,? extends ...> Java Basics - Anfänger-Themen 4
B ThreadPoolExecutor - import java.util.concurrent Java Basics - Anfänger-Themen 2
R java.util.Random Java Basics - Anfänger-Themen 8
S Methoden Sortieren: java.util.Arrays.useLegacyMergeSort Java Basics - Anfänger-Themen 4
F java.util.scanner wird übersprungen Java Basics - Anfänger-Themen 9
O java.util.Scanner hängt sich auf Java Basics - Anfänger-Themen 5
E Klassen java.util.ArrayList<E> als Generics Java Basics - Anfänger-Themen 16
D java.util.ResourceBundle - exception Java Basics - Anfänger-Themen 4
M Datentypen java.util.Arrays$ArrayList cannot be cast to [Ljava.lang.String; Java Basics - Anfänger-Themen 11
S Unterschied java.util.prefs / java.util.Properties Java Basics - Anfänger-Themen 3
M java.util.ArrayList to java.sql.Array Java Basics - Anfänger-Themen 4
D java.util.Currency Java Basics - Anfänger-Themen 2
T java.util.Date Java Basics - Anfänger-Themen 5
J java.util.format => mit String? Java Basics - Anfänger-Themen 2
N java.util.Random Java Basics - Anfänger-Themen 6
N verständnisfrage java.util.Calendar Java Basics - Anfänger-Themen 4
Luk10 Java.util.Scanner Java Basics - Anfänger-Themen 11
H ArrayList über java.util.Scanner füllen Java Basics - Anfänger-Themen 5
P ArrayList<E> in package java.util Java Basics - Anfänger-Themen 4
N java.util.Arrays.sort Warum sind Leerzeichen vor alphabetischen Zeichen sortiert? Java Basics - Anfänger-Themen 12
T import java.util.scanner cannot be resolved Java Basics - Anfänger-Themen 19
D java.util.Currency.getInstance exception mit brit. Pfund Java Basics - Anfänger-Themen 4
M Kann mir bitte jemand "java.util.ArrayList" erklären? Java Basics - Anfänger-Themen 5
V java.util.Stack Java Basics - Anfänger-Themen 9
J Java.Util.Properties wrapper class (Review Request) Java Basics - Anfänger-Themen 2
S BITTE UM HILFE HASHTABLE/import java.util.Hashtable in Ecplipse Java Basics - Anfänger-Themen 12
G DateFormat - Datumsformat java.util.Locale interpretieren Java Basics - Anfänger-Themen 2
? java.util.Properties Wert von key mehrfach vorhanden Java Basics - Anfänger-Themen 13
Q java.util.loggging neue datei erstellen Java Basics - Anfänger-Themen 3
L Exception in thread "main" java.util.NoSuchElement Java Basics - Anfänger-Themen 4
hedges Würfelwurf mit java.util.Random ohne 0 Java Basics - Anfänger-Themen 6
W Java.util.Map in Bean wandeln Java Basics - Anfänger-Themen 2
M java.util.Timer und geplante Abarbeitung Java Basics - Anfänger-Themen 2
U java.util.Date to java.sql.Date Java Basics - Anfänger-Themen 2
K Wer kann mir java.util.Hastable erklären. Java Basics - Anfänger-Themen 3
K Probleme mit java.util.hashtable Java Basics - Anfänger-Themen 10
K Zipfile erstellen mit java.util.zip.* Java Basics - Anfänger-Themen 2
J Eclipse und printf und import util.java.scanner; Java Basics - Anfänger-Themen 4
G java.util.LinkedList: Doppelte Elemente vermeiden Java Basics - Anfänger-Themen 5
K Prob mit java.util.regex.matches-String wird nicht erkannt? Java Basics - Anfänger-Themen 9
T Möchte Charwert 23C° mit java.util.Scanner einlesen macht Pr Java Basics - Anfänger-Themen 2
K java.util.Calendar und Objekt Java Basics - Anfänger-Themen 7
M Seltsames java.util.Date Problem Java Basics - Anfänger-Themen 6
M java.util.Scanner kann nicht aufgelöst werden - warum nicht? Java Basics - Anfänger-Themen 4
RaoulDuke java.util.Date parsen Java Basics - Anfänger-Themen 5
M Source Code von java.util.SubList Java Basics - Anfänger-Themen 2
ff java.util.date Java Basics - Anfänger-Themen 2
O reguläre Ausdrücke bei java.util.regex.Pattern Java Basics - Anfänger-Themen 4
K Keine weitere (java.util.)Scanner Eingabemöglichkeit? Java Basics - Anfänger-Themen 5
A wie implementiere ich java.util.Scanner? Java Basics - Anfänger-Themen 12
D Mit java.util.Arrays.sort die negativen Zahlen hinten Java Basics - Anfänger-Themen 4
C java.util.Timer und wait() oder so was Java Basics - Anfänger-Themen 3
G Leere java.util.List erzeugen Java Basics - Anfänger-Themen 2
S java.awt.List vs. java.util.List Java Basics - Anfänger-Themen 2
D dumme Frage! (was heist 'import java.util.*;' ?) Java Basics - Anfänger-Themen 3
H .java Dateien in Eclipse einbinden und ausführen Java Basics - Anfänger-Themen 1
onlyxlia Schlüsselworte Was meint man mit "einen Typ" in Java erstellen? Java Basics - Anfänger-Themen 2
O Java Kara geschweifte Klammern Java Basics - Anfänger-Themen 2
richis-fragen Mausrad logitech kann links und rechts klick wie in java abragen. Java Basics - Anfänger-Themen 15
XWing Java Klssenproblem Java Basics - Anfänger-Themen 4
R Umgebungsvariable java -cp gibt immer Java-Hilfe... Java Basics - Anfänger-Themen 3
farbenlos Csv Datei in Java einlesen Java Basics - Anfänger-Themen 18
F TableModelListener: java.lang.ArrayIndexOutOfBoundsException: 132 Java Basics - Anfänger-Themen 3
G Java 8 - Support-Ende Java Basics - Anfänger-Themen 7
T Java Weihnachtsbaum + Rahmen Java Basics - Anfänger-Themen 1
N Will mit Java anfangen Java Basics - Anfänger-Themen 13
Ü Java Array - Buchstaben als Zahlen ausgeben Java Basics - Anfänger-Themen 22
M Java Iterator Verständnisfrage Java Basics - Anfänger-Themen 6
M Java Mail Programm Java Basics - Anfänger-Themen 4
Sniper1000 Java 391 für Windows Java Basics - Anfänger-Themen 37
J Java long- in int-Variable umwandeln Java Basics - Anfänger-Themen 6
JaZuDemNo Java im Studium Java Basics - Anfänger-Themen 7
E Java Programm zur anzeige, ob Winter- oder Sommerzeit herrscht Java Basics - Anfänger-Themen 62

Ähnliche Java Themen

Neue Themen


Oben