1

我有一个我试图迭代的对象的 LinkedList(使用迭代器),看看它们是否有任何冲突,如果有,请将其从列表中删除。但是,我收到了一个并发修改异常。我把它放在一个同步块中,我还尝试在 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();
            }
        }
    }
}

对此问题的任何想法将不胜感激,我浏览了这里和谷歌,他们都说要么捕获异常要么同步它,这似乎都不起作用所以......请帮忙。

4

3 回答 3

4

为避免异常,请iter.remove()改用。这将通过迭代器实例删除元素,而不是当前调用,后者分别从列表中搜索和删除 - 即并发修改。

于 2012-12-04T02:52:20.497 回答
2

它引发异常,因为您直接使用toiletpaper.remove(tp);. 您必须iter.remove()在迭代集合时使用它来修改集合。

于 2012-12-04T02:52:33.007 回答
2

当您这样做时,toiletpaper.remove(tp)您会修改您的链接列表(重新链接它),因此您会收到该错误;您的迭代器不再有效。

于 2012-12-04T02:52:44.560 回答