更新JSONObject时发生并发修改异常

时间:2018-08-08 01:20:17

标签: java exception hashmap

我有一个JSONObject,如果地图中存在值,我需要在其中重命名一些键。这总是抛出ConcurrentModificationException。有什么方法可以实现这一目标,而不必经历多个循环?

JSONObject jsonObject = new JSONObject(result);
jsonObject.keySet().stream().forEach(key -> {
    if (someMap.containsKey(key)) { 
        jsonObject.put(someMap.get(key), jsonObject.get(key)); //Update the key in jsonObject with same value
        jsonObject.remove(key);
    }
});

1 个答案:

答案 0 :(得分:1)

ConcurrentModificationException的{​​{3}}解释了这一点:

  

如果单个线程发出违反对象约定的方法调用序列,则该对象可能会抛出此异常。例如,如果线程在使用快速失败迭代器迭代集合时直接修改集合,则迭代器将抛出此异常。

someMap开始处理您的问题,您不必同时进行修改,因此会引发异常。

一个解决方案可能是:

someMap.entrySet()
       .stream()
       .filter(entry -> jsonObject.has(entry.getKey()))
       .forEach(entry -> {
           jsonObject.put(entry.getKey(), entry.getValue());
           jsonObject.remove(entry.getKey());
       });

我不确定您为什么先put(),然后再remove(),但是再说一次,这对于解决方案不是必不可少的。

我假设您通过使用的方法使用JSON-lib,因此您也可以收集到地图:

someMap.entrySet()
       .stream()
       .filter(entry -> jsonObject.has(entry.getKey()))
       .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

JSONObject具有一个putAll(Map map),可以快速完成此任务。

那么哪种方法都适合您比较基准。