2017-01-03 6 views
2

Ich habe diesen folgenden Code-Chunk, mit dem ich den Wert in JSONObject speichern möchte, um darüber zu iterieren und über Front-End zu rendern.java.util.concurrentModification Ausnahme während der Iteration über JSONObject

 JSONObject dlCovs = jsonObject.getJSONObject("result").getJSONObject("cov_details"); 
     Iterator x = dlCovs.keys(); 
     while (x.hasNext()){ 
      String key1 = (String) x.next(); 
      String value1 = dlCovs.optString(key1); 
      dlCovs.put("covabbrv",key1); 
      dlCovs.put("dcIssuedt",value1); 
      dlCovs.put("vecatg",key1); 
      dlData.put("dlCovs", dlCovs); 
     } 

     /* dlCovs.put("covabbrv",cov); 
     dlCovs.put("issue_date",issue_date);*/ 
     dlObj.put("status","valid"); 
     dlData.put("dlCovs", dlCovs); 
     dlData.put("status","valid"); 

während sie über die Daten in while-Schleife iteriert i java.util.concurrentModificationException bin immer, sie ist auch ein Fall, wenn ich versuche, es zu debuggen, wird den Wert in dlData.put Speicher ("dlCovs ", dlCovs), aber sobald es zum zweiten Mal zur Wiederholung kommt, wird ein Fehler ausgegeben. Ich habe folgende JSON Wert

"cov_details": { 
    "MCWG": "NA", 
    "3WTR": "NA", 
    "PSV BUS": "NA", 
    "LMV": "NA", 
    "INVCRG": "NA" 
}, 

Jede Hilfe wird sehr spürbar sein, Dank im Voraus Code eingeben hier

Antwort

5

Sie modifizieren die Karte während seine Einträge iterieren. Das kannst du nicht tun.

die Elemente in eine separate Karte setzen, dann, dass danach auf Ihre "Haupt" Karte hinzufügen:

Map newEntries = new HashMap(); 
    Iterator x = dlCovs.keys(); 
    while (x.hasNext()){ 
    String key1 = (String) x.next(); 
    String value1 = dlCovs.optString(key1); 
    newEntries.put("covabbrv",key1); 
    // .. etc 
    } 

    dlCovs.putAll(newEntries); 

auch: don't use raw types. Sie sollten x wie erklärt werden:

Iterator<String> x = dlCovs.keys(); 

dann müssen Sie nicht über die Besetzung:

String key1 = x.next(); 

Ähnlich:

Map<String, String> newEntries = new HashMap<>(); 
+0

Selbst wenn ich d val nach dem Iterieren über die Schleife setze ich bekomme den gleichen Fehler, Stück Code dlCovs = jsonObject.getJSONObject ("Ergebnis") .getJSONObject ("cov_details"); Iterator x = dlCovs.keys(); while (x.hasNext()) { Zeichenfolge key1 = (String) x.next(); Zeichenfolge value1 = dlCovs.optString (key1); dlCovs.put ("covabbrv", Schlüssel1); dlCovs.put ("dcIssuedt", Wert1); dlCovs.put ("vecatg", Schlüssel1); } dlData.put ("dlCovs", dlCovs); – Mavericks

+0

Sie rufen immer noch 'dlCovs.put' in dieser Schleife auf, während Sie über' dlCovs.keys() 'iterieren. –

+0

Andy, danke für den Fehler, es hat für mich funktioniert. Danke vielmals. – Mavericks

0

Während Karten Iterieren über einen Iterator verwenden, können Sie nicht das ändern zugrunde liegende Karte. Es wird als schneller Iterator Fail bezeichnet, der direkt von der zugrunde liegenden Struktur liest. Java unterhält ein internes Flag namens mods, das die Anzahl der an der Map vorgenommenen Strukturänderungen zählt. Wenn der Iterator Mods findet, die geändert werden sollen, während er iteriert, gibt er eine gleichzeitige Modifikationsausnahme aus. In Java lösen gleichzeitige Hash-Maps das Problem, indem sie fehlersichere Iteratoren implementieren. Hauptsache, Sie können nicht die Struktur der Karte während der Iteration ändern

+0

danke für die Erklärung, aber zur gleichen Zeit bekomme ich ein Problem, das das gleiche wie oben ist, jetzt ist das Problem, es speichert nur den letzten Wert des Objekts beim Iterieren über andere Listen, wie in JSON-Daten erwähnt, nach debugging ich sehe, dass nur "INVCRG": "NA" wird auf dlCovs Wert gespeichert – Mavericks

Verwandte Themen