2012-04-05 15 views
0

問題が発生しました。解決策を見つけられませんでした。私はボールと呼ばれる別のオブジェクトと衝突した場合、_sballs ArrayListのオブジェクトが削除される小さなゲームを作っています。 私が遭遇した問題は、衝突が発生し、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

post stack trace from logcat。 – kosa

答えて

5

「クラッシュ」がConcurrentModificationExceptionであると推測しています。

イテレータを使って反復処理をしている間にコレクションから削除しようとしているために起こっています(forの拡張機能の内部動作)。明示的にイテレータを使用してインデックス(旧スタイルfor(i=0; i<_sballs.size(); i++)

  • 反復を使用して

    1. 反復、およびイテレータのremove()メソッドを使用します。

      あなたの選択肢があります。

    2. 削除するアイテムを別のリストに入れておき、ループが終了した後にremoveAll()を使用します。
  • +2

    これは正解ですが、最も堅牢でクリーンなソリューションだと思うので、オプション2を使用します。 – Bobbake4

    +0

    ありがとう! :) – user1295313

    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); 
    
    関連する問題