ホームページ >Java >&#&チュートリアル >反復中に ArrayList に追加するときに ConcurrentModificationException を回避するにはどうすればよいですか?

反復中に ArrayList に追加するときに ConcurrentModificationException を回避するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-07 04:32:15922ブラウズ

How to Avoid ConcurrentModificationException When Adding to an ArrayList During Iteration?

同時変更例外: ArrayList への追加

問題

OnTouchEvent メソッド内で ArrayList (mElements) を変更するときに、アプリケーションで ConcurrentModificationException が発生します。このコードは、Iterator を使用して mElement を反復処理し、特定のタッチ イベントが発生すると、新しい要素をリストに追加しようとします。これは、synchronized(mElements) ブロック内で発生します。

Exception

java.util.ConcurrentModificationException

Cause

ConcurrentModificationException は、ArrayList が (要素の追加によって) 変更されている間に発生します。イテレータを使用してトラバースされます。反復子は、基礎となるコレクションが反復中に変更されないままであることを期待します。ただし、反復中にリストに要素を追加することは、この期待に違反します。

解決策

例外を解決するには、反復の完了後に新しい要素をリストに追加する必要があります。これは、追加のリストを使用して新しい要素を保持し、反復後にそれらをメインの mElements リストに追加することで実現できます。

List<Element> thingsToBeAdd = new ArrayList<Element>();
for (Iterator<Element> it = mElements.iterator(); it.hasNext(); ) {
    Element element = it.next();
    // ...
    if (element.cFlag) {
        thingsToBeAdd.add(new Element("crack", getResources(), (int) touchX, (int) touchY));
        element.cFlag = false;
    }
}
mElements.addAll(thingsToBeAdd);

追加オプション

上記の解決策の代替として場合は、拡張された for-each ループ構文の使用を検討してください。これにより、反復子の必要性が回避され、同期が内部で処理されます。

for (Element element : mElements) {
    // ...
    if (element.cFlag) {
        thingsToBeAdd.add(new Element("crack", getResources(), (int) touchX, (int) touchY));
        element.cFlag = false;
    }
}
mElements.addAll(thingsToBeAdd);

以上が反復中に ArrayList に追加するときに ConcurrentModificationException を回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。