2012-04-05 82 views
0

即时通讯有一个问题,我还没有能够找出解决方案。我做了一个小游戏,其中_sballs ArrayList中的对象将与另一个名为ball的对象相撞时被删除。 我遇到的问题是当碰撞发生时,当我试图从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。

这里有什么问题? :)

+1

从logcat发布堆栈跟踪。 – kosa 2012-04-05 17:17:16

回答

5

我猜“碰撞”是一个ConcurrentModificationException

它正在发生,因为您正在使用迭代器(增强的内部工作方式)迭代迭代器时尝试从集合中移除它。

你的选择是:

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

这是正确的答案,我会选择2,因为我觉得它是最强大和最干净的解决方案。 – Bobbake4 2012-04-05 17:24:08

+0

非常感谢帅哥! :) – user1295313 2012-04-05 18:02:02

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); 
相关问题