绘画的并发修改例外原因?

时间:2013-05-18 02:00:29

标签: java paint repaint concurrentmodification

我遇到了并发修改异常错误的问题。在社区的帮助下,我设法修复了我的上一个错误,但是我认为这个错误更令人费解。

我现在在绘画时遇到并发修改错误,我担心这个错误会在paint函数本身中发生。不像我上次的错误,我不会删除一个实体,在这种情况下,我完全理解发生了什么,而不是如何解决它,另一方面我不明白这个错误。

 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();

2 个答案:

答案 0 :(得分:3)

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

在这种情况下,您的代码看起来非常好。您正在循环遍历activeTowers的成员。

堆栈跟踪将显示您尚未了解的任何内容....您有一个CME。

您需要了解的是 where 您要在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()也将返回一个'stable'迭代器(不会抛出CME,并且可能(或可能不)反映集合)

底线是CME只告诉你故事的一半......只有你的代码会告诉你剩下的......

答案 1 :(得分:0)

继续我们尊敬的成员的建议:

1)在提取List后修改Iterator时,通常会出现此错误。

2)我正在查看您的代码,除了在this方法中使用drawImage()外,它似乎没问题。这可能会改变您的List,因为This可以直接访问class members / class variables

3)如果多个线程同时访问List,也会发生这种情况。其中一个主题可能正在尝试从共享同一List实例的其他方法中更改ListI am saying some other method because concurrent read access should not create trouble if multiple threads were accessing this method

注意:请所有可能的代码和Stake跟踪来调试确切的问题。