使用list时获取ConcurrentException

时间:2016-02-05 09:53:31

标签: java

我正在使用以下代码:

List<String> layerDataList = new ArrayList<String>();
if (layerDataList.isEmpty()) {
  layerDataList.add(layerData);
}

Iterator<String> lir = layerDataList.iterator(); // Iterator created

while (lir.hasNext()) {
  String layerD = lir.next();
  if (layerD != layerData) {
    layerDataList.add(layerData);
  }
}

我得到例外:java.util.ArrayList$Itr.checkForComodification(Unknown Source)

问题是什么?

3 个答案:

答案 0 :(得分:3)

您无法使用Iterator遍历列表,并同时使用列表级add/remove方法修改列表。

要在这种情况下添加元素,您可以使用ListIterator及其方法add

答案 1 :(得分:1)

每当您修改Collection时,您都会使依赖它的所有Iterator无效。相反,您可以使用迭代器本身(假设您将其定义为ListIterator,或者在这些行中的某些内容)来修改集合:

ListIterator<String> lir = layerDataList.iterator();
while (lir.hasNext()) {
  String layerD = lir.next();
  if (layerD != layerData) {
    lir.add(layerData); // Here!
  }
}

答案 2 :(得分:0)

documentation说:

  

此ArrayList的迭代器和listIterator返回的迭代器   方法是快速失败的:如果列表在结构上被修改了   创建迭代器之后的时间,除了通过之外的任何方式   迭代器自己删除或添加方法,迭代器会抛出一个   ConcurrentModificationException的。因此,面对并发   修改,迭代器快速而干净地失败,而不是   在不确定的时间冒着任意的,非确定性的行为   在将来。

要在迭代到列表时添加,您可以尝试这样:

ListIterator<String> lir = layerDataList.iterator();
while (lir.hasNext()) {
  String layerD = lir.next();
  if (layerD != layerData) {
    lir.add(layerData); 
  }
}