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);
}
}
}
答案 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()
进行修改,否则无法修改正在迭代的集合。
您可以创建一个新的空集合并向其添加元素。