ArrayList迭代提供异常java.util.ConcurrentModificationException

时间:2013-11-13 20:26:43

标签: java exception arraylist

java.util.ConcurrentModificationException:“当不允许进行此类修改时,检测到并发修改对象的方法可能抛出此异常。”

知道我的set方法为什么会出现这种异常?

private ArrayList<Double> voltagesList = new ArrayList<Double>();
private ArrayList<String> devicesList = new ArrayList<String>();

public void setVoltage(String device, double voltage) { 
    for(String d: devicesList){
            if(d.equals(device)){
                voltagesList.set(devicesList.indexOf(device), voltage);
        }
            else{
                voltagesList.add(voltage);
                devicesList.add(device);
            }
    }
}

4 个答案:

答案 0 :(得分:4)

您应使用地图,而不是使用一对列表。

private final Map<String, Double> deviceVoltageMap = new HashMap<>();

public void setVoltage(String device, double voltage) { 
    deviceVoltageMap.put(device, voltage);
}

答案 1 :(得分:2)

是的,原因是devicesList.add(device);您正在添加到此列表,因为您正在迭代它。你不能在ArrayList上的foreach循环中这样做。

我通常做的是在一个单独的临时列表中收集我想要添加的内容,然后在循环之外调用addAll。这是一个例子:

package com.sandbox;

import java.io.FileNotFoundException;
import java.util.ArrayList;

public class Sandbox {

    public static void main(String[] args) throws FileNotFoundException {
        Sandbox sandbox = new Sandbox();
        sandbox.devicesList.add("foo");
        sandbox.setVoltage("bar", 1.0);
    }

    private ArrayList<Double> voltagesList = new ArrayList<Double>();
    private ArrayList<String> devicesList = new ArrayList<String>();

    public void setVoltage(String device, double voltage) {
        ArrayList<String> newDevicesList = new ArrayList<String>();
        for (String d : devicesList) {
            if (d.equals(device)) {
                voltagesList.set(devicesList.indexOf(device), voltage);
            } else {
                voltagesList.add(voltage);
                newDevicesList.add(device);
            }
        }
        devicesList.addAll(newDevicesList);
    }

}

答案 2 :(得分:2)

ListIterator<String> iter = devicesList.listIterator();
while(iter.hasNext()) {
   String d = iter.next();
   if(d.equals(device)){
       voltagesList.set(devicesList.indexOf(device), voltage);
   }
      else{
         voltagesList.add(voltage);
         iter.add(device);
   }
}

答案 3 :(得分:1)

除非您使用迭代器进行迭代并调用iterator.remove()进行修改,否则无法修改正在迭代的集合。

您可以创建一个新的空集合并向其添加元素。