我遇到了并发修改异常错误的问题。在社区的帮助下,我设法修复了我的上一个错误,但是我认为这个错误更令人费解。
我现在在绘画时遇到并发修改错误,我担心这个错误会在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();
答案 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
实例的其他方法中更改List
。 I am saying some other method because concurrent read access should not create trouble if multiple threads were accessing this method
。
注意:请所有可能的代码和Stake跟踪来调试确切的问题。