并发修改异常错误给我带来很多麻烦。在社区的帮助下,我设法解决了我的上一个错误,但是我认为这个错误更加令人困惑。

我现在在绘画时遇到并发修改错误,我担心此错误发生在绘画函数本身中。与我上一个错误不同,我不是要删除一个实体,在那种情况下,我完全了解发生了什么,而不是如何解决该问题,另一方面,我不理解该错误。

 TowerItr = activeTowers.iterator();

            while (TowerItr.hasNext()) {
                try {

                theTower = (ArcherTower) TowerItr.next();


                g.drawImage(tower, theTower.y * Map.blockSize, theTower.x * Map.blockSize, this);

                } catch (ConcurrentModificationException e) {


                }
            }


引发异常的行是这一行:
theTower =(ArcherTower)TowerItr.next();

最佳答案

ConcurrentModificationException(CME)总是有两个方面,并且只有一侧报告错误。

在这种情况下,您的代码看起来完美无缺。您正在遍历activeTowers的成员。

堆栈跟踪不会显示任何您不知道的内容。...您拥有CME。

您需要查找的是要在其中添加/删除activeTowers集合中的数据的位置。

在许多情况下,有相当容易的修复程序。一个可能的解决方法是在使用它的每个位置同步对activeTowers数组的访问。这可能很难做到。

另一个选择是使用java.util.concurrent。*包中的集合,并使用toArray(...)方法获取该集合的快照,然后可以在while循环中迭代该快照。

// activeTower must be something from java.util.concurrent.*
for (ArcherTower theTower : activeTower.toArray(new ArcherTower[0]) {
    g.drawImage(tower, theTower.y * Map.blockSize, theTower.x * Map.blockSize, this);
}


我应该补充一点,如果您使用java.util.concurrent。*集合,则iterator()也会返回一个“稳定”迭代器(不会抛出CME,并且可能(或可能不会)反映集合中的更改)

最重要的是,CME只告诉您一半的故事....而只有您的代码会告诉您其余的故事....

08-07 05:56