【问题标题】:Java concurrent modification exceptionJava并发修改异常
【发布时间】:2011-11-11 06:25:16
【问题描述】:

我编写了以下导致并发修改异常的代码。我该如何预防?这个想法是转义 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());

//请注意Parameter是hashMap所以,插入之前是否需要先删除该条目,否则它将替换与key关联的新值。它在 Java 中是如何工作的?

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

【问题讨论】:

    标签: java exception


    【解决方案1】:

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

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

    你应该改用iterator.remove()

    【讨论】:

      【解决方案2】:

      不确定是否需要更改 Map 的键,看来您只想更改数组中的值。

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

      我会确保地图确实存储了null 值。但是如果你不能改变这个,你需要添加if(values != null)

      【讨论】:

        【解决方案3】:

        只有在更改地图中的键时才应删除/添加。正如我在代码中看到的,您只更改了值。因此,您可以改用entry.setValue(...)

        【讨论】:

          【解决方案4】:

          当您使用快速失败的迭代器时会抛出 ConcurrentModificationException(例如:entry.iterator() 是快速失败的迭代器)。他们所做的是迭代原始集合对象。 为了能够修改和迭代集合对象,您可以使用故障安全迭代器(例如:List books = new CopyOnWriteArrayList())这将在迭代元素时在内存中获取副本,甚至您也会可以修改。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-03-01
            • 2012-11-21
            • 1970-01-01
            • 2016-11-19
            相关资源
            最近更新 更多