遍历JSONObject时出现java.util.concurrentModificationException异常。

3

我有以下代码片段,使用它我想将值存储在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");

当我在while循环中迭代数据时,我遇到了java.util.concurrentModificationException异常。还有一种情况是在调试时,它会将值存储在dlData.put("dlCovs",dlCovs)中,但是一旦第二次迭代时就会抛出错误。我有以下JSON值:

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

任何帮助都将不胜感激,提前致谢。输入代码如下:
2个回答

8
您正在遍历地图条目时修改地图。这是不允许的。
将项目放入单独的地图中,然后在此之后将其添加到您的“主”地图中:
  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);

此外:不要使用裸类型。你应该这样声明x
Iterator<String> x = dlCovs.keys();

那么您不需要强制转换:

String key1 = x.next();

同样地:

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

即使我在循环迭代后放置了d val,我仍然会得到相同的错误,代码块 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); - Mavericks
你仍然在循环中调用dlCovs.put,同时迭代dlCovs.keys() - Andy Turner
Andy,感谢你指出错误,这对我很有帮助。非常感谢。 - Mavericks

0

在使用迭代器迭代地图时,您不能更改底层地图。这被称为快速失败的迭代器,它直接从底层结构中读取。Java维护一个名为mods的内部标志,它计算对地图进行的结构性更改数量。如果迭代器在迭代时发现需要更改mods,则会引发Concurrent Modification异常。

在Java中,并发哈希映射通过实现安全失败迭代器来解决该问题。最重要的是您不能在迭代过程中更改地图的结构。


谢谢您的解释,但同时我现在遇到了一个与上述相同的问题,现在的问题是在迭代其他JSON数据中的列表时,它只保存对象的最后一个值,调试后我发现只有“INVCRG”:“NA”被存储在dlCovs值中。 - Mavericks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接