从ArrayList中删除对象时出现ConcurrentModificationException

时间:2013-11-28 19:37:04

标签: java arraylist

我的班级:

class Game{
     ArrayList<Block> blocks;
public ArrayList<Block> getBlocks(){return blocks;};
}
class Block{
    if(conditon) {
    game.getBlocks().remove(this);
}
}

我有这些类,ArrayList包含超过10个Block实例,如果删除Block类中当前块的条件为true,我需要从ArrayList中删除这个块,但是我得到了Exception ..

4 个答案:

答案 0 :(得分:2)

在迭代Arraylist时,不允许删除任何项目。如果要在迭代时删除项目,可以将删除的项目添加到新创建的ArrayList中。 迭代完成后willBeRemovedList,您可以一次删除所有这些内容。

答案 1 :(得分:2)

迭代器抛出了

ConcurrentModificationException,因为你修改了一个列表并且他不能得到nextElement,因为他不知道他正在迭代的列表到底发生了什么。

for (Block block : blocks) {
  blocks.remove(block);
}

这将在for循环尝试获取修改列表的下一个元素时抛出异常,因为Iterator在循环遍历列表的开头实例化,迭代器将无法选择右下一个元素并且将抛出异常。

但是,您可以从正在迭代的列表中删除当前元素,但应该通过Iterator本身来完成。你会做这样的事情:

for (Iterator<Block> iterator = blocks.iterator(); iterator.hasNext(); iterator.next()){
  iterator.remove();
}

答案 2 :(得分:1)

ArrayList class的文档干净地告诉我们原因以及如何避免它:

  

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

答案 3 :(得分:0)

如果故障快速迭代器检测到 在迭代期间进行了修改,它会抛出 ConcurrentModificationException,这是一个未经检查的例外。您很可能在同一循环中迭代和修改集合。

此外,java.util包中的集合类都返回失败快速迭代器, 这意味着他们假设一个集合在此期间不会改变其内容 线程迭代其内容的时间。