我有一个试图迭代的对象的链接列表(使用迭代器),看看它们是否有任何冲突,如果有,请将其从列表中删除。但是,我得到一个并发修改异常。我把它放在一个synchronized块中,我也尝试在try catch块中捕获错误,似乎都没有帮助,代码在这里:
private void updateTP() {
synchronized (toiletpaper) {
Iterator<ToiletPaper> iter = toiletpaper.iterator();
while (iter.hasNext()) {
ToiletPaper tp = iter.next();
tp.update(1000, 700);
if (toilet.overlaps(tp)) {
System.out.println("tp splash!");
toiletpaper.remove(tp);
menu.removeLife();
}
}
}
}
对这个问题的任何想法都会受到赞赏,我通过这里和google查看,并且所有人都说要么抓住异常或同步它,这似乎都不起作用......请帮忙。
答案 0 :(得分:4)
要避免异常,请改用iter.remove()
。这将通过迭代器实例删除元素,而不是当前调用,它单独搜索和从列表中删除 - 即并发修改。
答案 1 :(得分:2)
它正在抛出异常,因为您正在使用toiletpaper.remove(tp);
直接修改集合。在迭代它时,你必须使用iter.remove()
修改集合。
答案 2 :(得分:2)
当您执行toiletpaper.remove(tp)
时,您修改了链接列表(重新链接它),因此您会收到该错误;你的迭代器不再有效。