AndroidでConcurrentModificationException
使用する場合の回避方法は?ArrayList
誰かがそれを避けるための基本的な経験則を与えることができますか?
配列リストを反復処理するときに要素を追加/削除しないことにより。
このコードは、反復中にリストを変更しているため、ConcurrentModificationException をスローします。
List<String> al = new ArrayList<String>();
al.add("2");
for(String s: al) {
al.remove("2");
}
このコードは ConcurrentModificationException をスローしません。
List<String> al = new Arraylist<String>();
Iterator<String> itr = al.iterator();
while(itr.hasNext()){
itr.next();
itr.remove();
}
反復中にリストを変更してもスローされないjava.util.concurrent.CopyOnWriteArrayListなどのjava.util.Concurrentパッケージのクラスの一部を使用することもできます。ConcurrentModificationException
CopyOnWriteArrayList<String> al = new CopyOnWriteArrayList<String>();
al.add("2");
Iterator<String> itr = al.iterator();
while(itr.hasNext()){
itr.next();
al.add("3");
}
ArrayList 内の要素を削除する場合は、Iterator を使用します。例えば:
ArrayList<String> someStrings;
// fill someStrings
Iterator<String> it = someStrings.iterator();
while(it.hasNext()){
String buf = it.next();
// do sth here
}
これは、反復処理中に ArrayList に要素を追加/削除/挿入すると発生します。
悪いコードの例:
Iterator it = list.iterator()
while (it.hasNext())
{
Object o = it.next();
list.remove(o);
}