我有两个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();作为绘制异常的线,但我不知道那是什么告诉我。
任何人都可以帮我弄清楚我做错了吗?
谢谢!
答案 0 :(得分:5)
是的,ListIterator旨在允许修改列表。但是您没有使用ListIterator的remove()方法,而是直接操作底层列表本身。
答案 1 :(得分:0)
替换
blockList.remove(block);
与
it.remove();
如果您以其他方式删除元素,则可以获得CME。
答案 2 :(得分:0)
您需要致电remove()
上的Iterator
,而不是List
。
来自javadoc:
如果单个线程发出一系列方法调用 违反对象的合同,对象可能抛出这个 例外。例如,如果线程直接修改集合 而它使用快速失败的迭代器迭代集合, 迭代器会抛出这个异常。