尝试从ArrayList中删除对象时崩溃

时间:2012-04-05 17:16:27

标签: android object crash arraylist

我有一个问题,我还没有找到解决方案。我正在制作一个小游戏,如果与另一个名为ball的对象相撞,_sballs ArrayList中的对象将被删除。 我遇到的问题是,当碰撞发生时,当我尝试从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);
            }
        }

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

这是什么问题? :)

2 个答案:

答案 0 :(得分:5)

我猜测"崩溃"是ConcurrentModificationException

这种情况正在发生,因为当您使用迭代器(增强的for的内部工作方式)迭代它时,您试图从集合中删除。

您的选择是:

  1. 使用索引(旧式for( i=0; i<_sballs.size(); i++ )
  2. 进行迭代
  3. 显式迭代使用迭代器,并使用迭代器的remove()方法。
  4. 记住要将哪些项目放入另一个列表中删除,然后在循环结束后使用removeAll()

答案 1 :(得分: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);