1

重複の可能性:
ArrayList の java.util.ConcurrentModificationException

スレッド内のリストからアイテムを削除しようとしています。を取得してい ConcurrentModificationExceptionます。リストからアイテムを削除することに関連していることをこのリンクから読みました。以下にサンプルコードを置いておきます。私の場合、この例外なしでこれを適切に行うにはどうすればよいですか。

try 
{
    for(Game game:appDeleg.getGlobalGames().getGames())
    {
        if(game.getOwner().getId().equals(params[0]))
        {
            synchronized (appDeleg.getGlobalGames().getGames())
            {
                appDeleg.getGlobalGames().getGames().remove(game);
            }
        }

    }
}

catch (Exception e) 
{
    e.printStackTrace();
    return "noconnection";
}
4

5 に答える 5

5

イテレータを使用:

Iterator<Game> i = appDeleg.getGlobalGames().getGames().iterator();

Game game;
while(i.hasNext()) {
    game = i.next();
    if(game.getOwner().getId().equals(params[0]))
          i.remove();
    }
}
于 2012-11-23T11:44:39.117 に答える
2

強化された for ループは反復子を使用します。イテレータは、反復処理中にコレクションが変更された場合に例外をスローできます。

あなたの場合、イテレータではなくコレクションからアイテムを削除しています。

暗黙の反復子を使用せずに、標準の for ループを使用してみてください。コレクションが配列リストであると仮定します。

ArrayList games = appDeleg.getGlobalGames().getGames();
for(int i=0;i<games.size();i++){
      Game game = games.get(i);
      if(game.getOwner().getId().equals(params[0])){
       games.remove(i);

      }
}
于 2012-11-23T11:52:34.943 に答える
1

削除する項目を新しいリストに収集し、元のリストをループした後にそれらを削除します。

于 2012-11-23T11:40:45.747 に答える
1

synchornized キーワードはここであなたを保護しません。
この例外イベントには、シングル スレッド アプリケーションから到達できます (はい、例外の名前が誤解を招くと主張する可能性があります)。
これは、イテレーターを使用してリストを反復処理する
か (削除する値に到達したときに remove を呼び出すことができます)、
または削除する要素を別のリストに収集してから removeAll を実行する必要があります。その上で方法。

于 2012-11-23T11:40:54.060 に答える
1

反復中にリストのアイテムを削除することはできません。スローされますConcurrentModificationException

反復子の作成後に、反復子自体の remove または add メソッド以外の方法でリストが構造的に変更された場合、反復子は ConcurrentModificationException をスローします。したがって、同時変更に直面した場合、反復子は、将来の不確定な時点で恣意的で非決定論的な動作を危険にさらすのではなく、迅速かつ明確に失敗します。

ドキュメント ->リンク

Iteratorリストからアイテムを削除する必要があります。

于 2012-11-23T11:43:32.310 に答える