我做了一个小游戏,在屏幕上绘制敌人,敌人来自ArrayList.屏幕重新绘制,以便敌人也可以移动.我这个代码执行此操作:
for (Meteor m : getMeteorArrayList()) { if (m.getVisible()) { canvas.drawBitmap(m.getImg(), m.getX(), m.getY(), p); } else { Iteratoriter = getMeteorArrayList().iterator(); while (iter.hasNext()) { if (iter.next() == m) { iter.remove(); } } } }
但是这给了一个问题.如果我杀死敌人,我希望它从ArrayList中删除.我知道我可以将它设置为NULL但它仍然存在.我Iterator
可以在上面的代码中看到这个.
这样做的问题是,如果在我移除敌人后重新绘制屏幕,则应用程序会因此错误而崩溃:
java.util.ConcurrentModificationException at java.util.ArrayList$ArrayListIterator.next(ArrayList.java:573)
我想这是因为我突然在敌人所在地的ArrayList上有一个洞.我怎样才能这样做,以便我可以从ArrayList中删除一些东西,然后仍然可以访问其余的东西?
你的问题是你在列表上迭代两次 - 一次隐式(使用增强的for循环),第二次使用显式迭代器.如果只使用显式迭代器,则可以从列表中删除该元素.
Iteratoriter = getMeteorArrayList().iterator(); while (iter.hasNext ()) { Meteor m = iter.next (); if (m.getVisible()) { canvas.drawBitmap(m.getImg(), m.getX(), m.getY(), p); } else { iter.remove(); } }