Я искал 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);
}
}
}
Но в других случаях это не практично. Я продолжаю получать ConcurrentModificationExceptions в моем методе drawProjectiles()
, хотя он ничего не меняет. Я предполагаю, что виновником является то, что я коснулся экрана, который создает новый объект Projectile и добавляет его в Registry.proj, пока метод draw все еще итерируется.
Я не очень хорошо могу сделать цикл повторения с помощью метода draw, иначе он будет перерисовывать некоторые объекты. Так что теперь я вынужден найти новое решение ... Есть ли более стабильный способ выполнения того, что я делаю?
Да, и часть 2 моего вопроса: многие люди предлагают использовать ListIterators (как я использовал), но я не понимаю ... если я вызываю ListIterator.remove()
, удаляет ли он этот объект из ArrayList, через который он перебирает, или просто удалить его из самого итератора?