1

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

4 回答 4

4

您应该使用 Map 而不是使用一对列表。

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

public void setVoltage(String device, double voltage) { 
    deviceVoltageMap.put(device, voltage);
}
于 2013-11-13T20:38:32.817 回答
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);
   }
}
于 2013-11-13T20:31:17.567 回答
2

是的,你得到这个的原因是你在迭代它devicesList.add(device); 时添加到这个列表中。您不能在.ArrayList

我通常做的是将要添加的东西收集到一个单独的临时列表中,然后在我调用的循环之外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);
    }

}
于 2013-11-13T20:27:32.313 回答
1

您不能修改您正在迭代的集合,除非您使用迭代器进行迭代并调用iterator.remove()以修改它。

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

于 2013-11-13T20:32:00.980 回答