0

私は解決策を見つけることができなかった問題を抱えています。ボールと呼ばれる別のオブジェクトと衝突すると、_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 を削除しようとします。

ここで何が問題なのですか?:)

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 に答える