2012-04-05 80 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); 
相關問題