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=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
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