我正在开发一个匹配的游戏(用Java),玩家抛出并对象,系统将检查它是否与棋盘上的任何相邻棋子相匹配。我目前能够检查一个相邻的部分(使用矩形交叉点),但是如果我在if / else块之后没有return;
(从而阻止它检查多个相邻的部分),它将抛出java.util.ConcurrentModificationException
异常。我还没有办法解决这个问题。
我使用迭代器遍历所有碎片并检查它们是否与抛出的碎片相交。这个检查是在作品遇到某些东西之后完成的(也通过矩形交叉点检查)。
以下是问题区域的代码段:
Iterator<Food> it3 = foods.iterator();
while(it3.hasNext()) {
Food f2 = it3.next();
if(t.checkAll().intersects(f2.getBounds())) { // check for matches
if(t.getNutritionType() == f2.getNutritionType() || t.getType() == 0) {
app.log("Throw intersects with like food.");
int numMatches = 2; // hard-coded until multiple matching works
player.addNutrient(f2.getNutritionType(), 1);
player.addCalories(10*numMatches);
// move food to cart and add to matched
f2.fallToCart(600, 540);
matched.add(f2);
// remove from food arraylist
it.remove();
it3.remove();
return;
} else {
app.log("Throw intersects with unlike food.");
t.stop();
Food n = new Food(t.getType());
n.setX(t.getX());
n.setY(t.getY());
foods.add(n);
it.remove();
return;
}
}
}
请注意it
是&#39;抛出&#39;迭代器和it2
是用于停止抛出的碎片的第一次碰撞检查。投掷是投掷,食物是游戏片。
如果我写的内容令人困惑,我很抱歉。我非常乐意澄清任何事情。基本上我的问题归结为如何多次迭代匹配(单独或一次),因为匹配可以在throw的任何一侧,并且多个对象可以匹配。
答案 0 :(得分:0)
无法理解您的代码(请参阅我的评论),我可以告诉您问题所在。如果您阅读ConcurrentModificationException
实际上是什么,您将进入解释的部分
[...]如果一个线程在使用失败快速迭代器迭代集合时直接修改集合,迭代器将抛出此异常。
您正在使用it3
进行迭代,然后调用it3.remove()
。