ConcurrentModificationException

Booyeoo

Mitglied
Hallo zusammen,

ich verzweifele gerade an einer Fehlermeldung "ConcurrentModificationException". Anhand des Namens und diverser google Einträge handelt es sich hierbei um einen Fehler der wohl auftritt wenn von mehreren Threads auf ein Objekt zugegriffen wird usw...

In meinem fall sehe ich das aber nicht wieso mehrfach auf das Objekt zugegriffen wird. Die Applikation ist nur single threaded und ich weiß nicht wieso er mir diese Fehlermeldung ausspuckt wenn er zum zweiten mal, nachdem er den iterator wieder erneuert hat, diese Fehlermeldung ausspuckt. Die Funktion ist nun auch synchronized trotzdem bekomme ich den Fehler.

Die Kurzfassung:

der methodenkopf und static variablen:

Java:
 static TreeMap stmProbs1, stmProbs2, stmProbsNormed, stmIntervals1, stmIntervals2, stmIntervalsNormed, stmInitials, stmEmission;
    static String[] ssaDiscretes1, ssaDiscretes2, ssaDiscretesNormed;
    static double[] sdaIncreasement1, sdaIncreasement2;
    static double top1,top2,bottom1,bottom2;
(...)

[JAVA=1136]

private synchronized TreeMap getNormalHMMPrediction() {

StringBuffer sb = new StringBuffer(128);
StringBuffer sbtemp = new StringBuffer(128);
String actualtemp = "";
TreeMap<String, Double> predictions = new TreeMap<String, Double>();
TreeMap<String, Double> predtemp = new TreeMap<String, Double>();
TreeMap<String, Double> predtemp2 = new TreeMap<String, Double>();
double probability = 0.0, probtemp = 0.0;
(...)
[/code]

Der Fehler tritt in Zeile 1235 auf...

Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException
at java.util.TreeMap$PrivateEntryIterator.nextEntry(TreeMap.java:1100)
at java.util.TreeMap$KeyIterator.next(TreeMap.java:1154)
at hmm1.HMM1Main.getNormalHMMPrediction(HMM1Main.java:1235)
at hmm1.HMM1Main.butNormalPredictActionPerformed(HMM1Main.java:1897)

[JAVA=1223]
(...)
} else {
Set set2;
if (i == ssaDiscretesNormed.length + 1) {
set2 = predtemp.navigableKeySet();
} else {
set2 = predtemp2.navigableKeySet();
}
Iterator it2 = set2.iterator();
String actualDiscrete = "", actualBase = "";
while (it2.hasNext()) {
set = stmIntervals2.navigableKeySet();
it = set.iterator();
actualBase = (String)it2.next().toString();
if (i == ssaDiscretesNormed.length + 1) {
probability = predtemp.get(actualBase);
} else {
probability = predtemp2.get(actualBase);
}
probtemp = probability;
sb = new StringBuffer(128);
sb.append(actualBase);
sbtemp = new StringBuffer(sb);
while (it.hasNext()) {
(....)
if (probability > 0) {
predictions.put(sb.toString(), probability);
predtemp2.put(sb.toString(), probability);
}
(...)
[/code]


Mir ist gerade aufgefallen, dass predtemp2 hier geändert wird. set2 ist ja von predtemp2 abhängig. kann es sein dass ich hier etwas beachten oder einbauen muss damit das funktioniert?





hier nochmal die lange Version:
[JAVA=1224]
Set set2;
if (i == ssaDiscretesNormed.length + 1) {
set2 = predtemp.navigableKeySet();
} else {
set2 = predtemp2.navigableKeySet();
}
Iterator it2 = set2.iterator();
String actualDiscrete = "", actualBase = "";
while (it2.hasNext()) {
set = stmIntervals2.navigableKeySet();
it = set.iterator();
actualBase = (String)it2.next().toString();
if (i == ssaDiscretesNormed.length + 1) {
probability = predtemp.get(actualBase);
} else {
probability = predtemp2.get(actualBase);
}
probtemp = probability;
sb = new StringBuffer(128);
sb.append(actualBase);
sbtemp = new StringBuffer(sb);
while (it.hasNext()) {
actualDiscrete = it.next().toString();
sb = new StringBuffer(sbtemp);
probability = probtemp;
sb.append(actualDiscrete.toString());
// emission
if (stmEmission.containsKey(ssaDiscretes1)) {
TreeMap tmtemp = (TreeMap) (stmEmission.get(ssaDiscretes1));
if (tmtemp.containsKey(actualDiscrete.toString())) {
probability *= Double.parseDouble((tmtemp.get(actualDiscrete.toString())).toString());
} else // optimierungsmöglichkeit - break einfügen
{
probability = 0;
}
} else {
System.out.println("WARNING : Emissionmatrix - not filled item: " + ssaDiscretes1);
}
if (probability > 0) {
// übergang
// von letzem wert im momentanen kandidaten zum aktuellen der zu überprüfen ist
if (stmProbs1.containsKey(Character.toString(sb.charAt(sb.length()-2)))) {
TreeMap tmtemp = (TreeMap) (stmProbs1.get(Character.toString(sb.charAt(sb.length()-2))));
if (tmtemp.containsKey(actualDiscrete.toString())) {
probability *= Double.parseDouble((((TreeMap) (tmtemp)).get(actualDiscrete)).toString());
} else {
probability = 0;
}
}
}
if (probability > 0) {
predictions.put(sb.toString(), probability);
predtemp2.put(sb.toString(), probability);
}[/code]


Grüße
und danke für jeden Kommentar
 
M

maki

Gast
Wenn du über eine Collection iterierst, dann darfst du diese nur mit dem Iterator ändern.

Ansonsten?
Mal ganz ehrlich, blickst du durch deinen Code durch?
Man kann ein Programm auch mit mehr als einer einzigen Methode schreiben ;)
 

Booyeoo

Mitglied
Danke maki für die schnelle hilfe.

Habe es jetzt über eine neue TreeMap gelöst.....und weil ich kein programmiergott bin
ist es deshalb so unübersichtlich....weil ich immer hier und da was ändern (immer irgendwelche temp variablen benutzen),

ich wette bei python wäre das alles kein problem allerdings kann man da nicht so einfach guis erstellen...

Vielen Dank nochmal
Grüße
 
M

maki

Gast
Dafür gibt es übrigens Refactorings ;)
zB. "extract Method": Refactoring: Extract Method

Code wie deiner macht dir mehr Probleme anstatt dich zu unterstützen, Bugs haben viel Platz und brauchen sich nichtmal verstecken.

Nicht als neg. Kritik ansehen, eher als Tipp.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M ConcurrentModificationException Allgemeine Java-Themen 2
D java.util.ConcurrentModificationException tritt auf Allgemeine Java-Themen 12
F ConcurrentModificationException warum ? Allgemeine Java-Themen 7
K Collections java.util.ConcurrentModificationException Allgemeine Java-Themen 3
N ConcurrentModificationException Allgemeine Java-Themen 2
S java.util.ConcurrentModificationException - aber nur ein Thread Allgemeine Java-Themen 3
D java.util.ConcurrentModificationException - per Copy vermeiden Allgemeine Java-Themen 11
D java.util.ConcurrentModificationException bei ArrayList Allgemeine Java-Themen 2
F ConcurrentModificationException Allgemeine Java-Themen 2
P Vectoren bearbeiten: ConcurrentModificationException Allgemeine Java-Themen 4
G ConcurrentModificationException - finds nicht Allgemeine Java-Themen 5
S Fehler ConcurrentModificationException Allgemeine Java-Themen 8
R java.util.ConcurrentModificationException vermeiden? Allgemeine Java-Themen 8
R ConcurrentModificationException Allgemeine Java-Themen 9
D ConcurrentModificationException nicht nachvollziehbar Allgemeine Java-Themen 8
K Threading - schreiben auf Hashmap/löschen - ConcurrentModificationException Allgemeine Java-Themen 3
J java.util.ConcurrentModificationException bei HashMap? Allgemeine Java-Themen 2
G ConcurrentModificationException Allgemeine Java-Themen 4
E ConcurrentModificationException Allgemeine Java-Themen 6
R ConcurrentModificationException trotz synchronized? Allgemeine Java-Themen 12
P java.util.ConcurrentModificationException Allgemeine Java-Themen 9
M ConcurrentModificationException Allgemeine Java-Themen 6
S ConcurrentModificationException Allgemeine Java-Themen 4

Ähnliche Java Themen

Neue Themen


Oben