0

我有一个问题,我无法找到解决方案。我正在制作一个小游戏,如果 _sballs ArrayList 中的对象与另一个名为 ball 的对象发生碰撞,将被删除。我遇到的问题是,当发生冲突时,当我尝试从 ArrayList 中删除对象时,应用程序崩溃。

for(GObject sballgraphic : _sballs){
            Coordinates sballcoords = sballgraphic.getCoords();
            if(coords.getY() - coords._height > sballcoords.getY() + sballcoords._height && coords.getX() - coords._width > sballcoords.getX() + sballcoords._width){
                _sballs.remove(sballgraphic);
            }
        }

因此代码将球坐标与所有球对象进行比较,以检查是否存在碰撞,然后尝试移除球。

这里有什么问题?:)

4

2 回答 2

6

我猜“崩溃”是一个ConcurrentModificationException.

发生这种情况是因为您在使用迭代器迭代集合时尝试从集合中删除(增强 for 的内部工作原理)。

您的选择是:

  1. 使用索引进行迭代(旧式for( i=0; i<_sballs.size(); i++ )
  2. 显式使用迭代器进行迭代,并使用迭代器的remove()方法。
  3. 通过将它们放入另一个列表来记住要删除的项目,然后removeAll()在循环完成后使用。
于 2012-04-05T17:22:25.720 回答
1

你不能做这样的操作,因为你正在修改_sballs你正在迭代的那个。

ArrayList<GObject> _sballs;
ArrayList<GObject> _sballsForRemove;

for(GObject sballgraphic : _sballs){
            Coordinates sballcoords = sballgraphic.getCoords();
            if(coords.getY() - coords._height > sballcoords.getY() + sballcoords._height && coords.getX() - coords._width > sballcoords.getX() + sballcoords._width){
                _sballsForRemove.add(sballgraphic);
            }
        }
_sballs.removeAll(_sballsForRemove);
于 2012-04-05T17:20:36.567 回答