gpt4 book ai didi

java - 绘画导致并发修改异常?

转载 作者:行者123 更新时间:2023-12-01 23:48:43 25 4
gpt4 key购买 nike

我一直因并发修改异常错误而遇到很多麻烦。在社区的帮助下,我设法修复了上一个错误,但我认为这个错误更令人费解。

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

 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,并且可能(或可能不会)反射(reflect)集合)

底线是 CME 只告诉您一半的故事......只有您的代码才能告诉您其余的......

关于java - 绘画导致并发修改异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16620005/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com