java.util.concurrentModification迭代JSONObject时的异常

时间:2017-01-03 12:51:33

标签: java json

我有以下代码块,我希望将其存储在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 个答案:

答案 0 :(得分:6)

您正在修改地图,同时迭代其条目。你不能这样做。

将项目放入单独的地图中,然后将其添加到“主”地图中:

  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);

另外:don't use raw types。你应该声明x喜欢:

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

然后你不需要演员:

String key1 = x.next();

类似地:

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

答案 1 :(得分:0)

使用迭代器迭代地图时,无法更改基础地图。它被称为Fail fast iterator,它直接从底层结构读取。 Java维护一个名为mods的内部标志,用于计算对映射所做的结构更改的数量。如果迭代器在迭代时发现要更改的mod,则它会抛出并发修改异常。 在Java并发哈希映射中,通过实现故障安全迭代器来解决问题。主要的是你在迭代时不能改变地图的结构