私は StackOverflow を検索しましたが、多くの ConcurrentModificationException の質問があります。それらを読んだ後、私はまだ混乱しています。私はこれらの例外をたくさん受けています。オブジェクトを追跡するために「レジストリ」セットアップを使用しています。
public class Registry {
public static ArrayList<Messages> messages = new ArrayList<Messages>();
public static ArrayList<Effect> effects = new ArrayList<Effect>();
public static ArrayList<Projectile> proj = new ArrayList<Projectile>();
/** Clears all arrays */
public static void recycle(){
messages.clear();
effects.clear();
proj.clear();
}
}
次のように ArrayLists にアクセスして、これらのリストにオブジェクトを追加および削除していますRegistry.effects.add(obj)
。Registry.effects.remove(obj)
再試行ループを使用して、いくつかのエラーを回避することができました。
//somewhere in my game..
boolean retry = true;
while (retry){
try {
removeEffectsWithSource("CHARGE");
retry = false;
}
catch (ConcurrentModificationException c){}
}
private void removeEffectsWithSource(String src) throws ConcurrentModificationException {
ListIterator<Effect> it = Registry.effects.listIterator();
while ( it.hasNext() ){
Effect f = it.next();
if ( f.Source.equals(src) ) {
f.unapplyEffects();
Registry.effects.remove(f);
}
}
}
しかし、それ以外の場合、これは実用的ではありません。drawProjectiles()
何も変更していないにもかかわらず、メソッドで ConcurrentModificationExceptions を取得し続けます。犯人は、画面に触れた場合だと思います。これにより、新しい Projectile オブジェクトが作成され、 draw メソッドがまだ反復している間に Registry.proj に追加されます。
draw メソッドで再試行ループをうまく実行できないか、オブジェクトの一部を再描画します。だから今、私は新しい解決策を見つけることを余儀なくされています..私がやっていることを達成するためのより安定した方法はありますか?
ああ、私の質問のパート 2: 多くの人が (私が使用してきたように) ListIterators を使用することを提案していますが、私は理解できませんListIterator.remove()
。イテレータ自体?