ListIterator和并发修改异常的问题

时间:2012-02-23 21:14:14

标签: java arraylist iterator

我有两个ArrayLists,每个都包含一定大小的块:blockList,eraserList。块是具有两个字段的对象:开始和结束。我需要从另一组块中减去一组块。

我必须遍历rubseList并从blockList中“擦除”它们重叠的块。因此我的代码看起来像:

 void eraseBlocks (Arrylist<Blocks> blockList, ArrayList<Blocks> eraserList) {
    ListIterator<Blocks> it = blockList.listIterator();

    for (Blocks eraser: eraserList) {
        while (it.hasNext()) {
            Blocks block= it.next();
            if ((eraser.start <= block.start) && (eraser.end >= block.end))
                 blockList.remove(block);
            else if ((eraser.start <= block.start) && (eraser.end < block.end)){
                 block.set(start, eraser.end);
            else if () {
                        ...
                 //more code for where the eraser partially erases the beginning, end, or splits the block
                 //if statements call the .add(), .set(), and remove() methods on the blockList.
                        ...
                  }
            }
        }

我不明白为什么我会收到并发修改例外。我从不修改eraserList。

我正在尝试修改“Block block = it.next();”中分配的块对象。声明。我也通过删除或添加块到列表来修改blockList。我认为ListIterator的重点在于它允许您修改,添加或减去您正在浏览的列表。

故障跟踪指向块橡皮擦= it.next();作为绘制异常的线,但我不知道那是什么告诉我。

任何人都可以帮我弄清楚我做错了吗?

谢谢!

3 个答案:

答案 0 :(得分:5)

是的,ListIterator旨在允许修改列表。但是您没有使用ListIterator的remove()方法,而是直接操作底层列表本身。

答案 1 :(得分:0)

替换

blockList.remove(block);

it.remove();

如果您以其他方式删除元素,则可以获得CME。

答案 2 :(得分:0)

您需要致电remove()上的Iterator,而不是List

来自javadoc:

  

如果单个线程发出一系列方法调用   违反对象的合同,对象可能抛出这个   例外。例如,如果线程直接修改集合   而它使用快速失败的迭代器迭代集合,   迭代器会抛出这个异常。