Java并发修改异常

时间:2011-11-11 06:25:16

标签: java exception

我编写了以下代码,导致并发修改异常。我该怎样预防呢?我们的想法是逃避Map的所有值,并使用新的param map重新构建对象(dO)。

    try {
        Map<String,String[]> paramMap = dO.getParameterMap();
        Set<Map.Entry<String, String[]>> entries = paramMap.entrySet();
        Iterator<Map.Entry<String, String[]>> it = entries.iterator();
        while (it.hasNext()) {
            Map.Entry<String, String[]> entry = it.next();
            String[] values = entry.getValue();
            List<String> valList = new ArrayList<String>();
            if (values != null) {
                for (String value : values) {
                    valList.add(escapeHTML(value));
                     }
                dO.removeParameter(entry.getKey());

//请注意参数是一个hashMap,因此,在插入之前是否需要先删除该条目,否则它将替换与key关联的新值。它在Java中的工作原理?

                dO.addParameter(entry.getKey(),valList.toArray(new String[valList.size()]));
               }
            }
        }

4 个答案:

答案 0 :(得分:12)

抛出异常是因为您在迭代时正在添加/删除地图中的内容:

dO.removeParameter(entry.getKey());
dO.addParameter(entry.getKey(),valList.toArray(new String[valList.size()]

您应该使用iterator.remove()代替。

答案 1 :(得分:0)

不确定是否需要更改Map的键,看来你想要做的就是改变数组中的值。

for(String[] values: dO.getParameterMap().values()) 
    for (int i = 0; i < values.length; i++) 
        values[i] = escapeHTML(values[i]);

我会确保Map确实存储了null个值。但是,如果您无法更改此设置,则需要添加if(values != null)

答案 2 :(得分:0)

只有在更改地图中的某个键时才应删除/添加。正如我在代码中看到的那样,您只是在改变价值。因此,您可以使用entry.setValue(...)代替。

答案 3 :(得分:0)

当您使用快速故障迭代器时,会抛出

ConcurrentModificationException(例如:entry.iterator()是快速故障迭代器)。他们要做的是遍历原始集合对象。 为了能够修改和遍历集合对象,可以使用故障保护迭代器(例如:List books = new CopyOnWriteArrayList <>()),这将在遍历元素时在内存中复制一个副本,甚至您将能够对其进行修改。