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

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

Mary-Kate Olsen
リリース: 2024-11-30 20:25:13
オリジナル
987 人が閲覧しました

How to Avoid ConcurrentModificationException When Modifying an ArrayList During Iteration?

反復中に ArrayList を変更する際の ConcurrentModificationException

報告された例外は ConcurrentModificationException であり、ArrayList、mElements を変更しようとしたときに発生します。

内部OnTouchEvent ハンドラーには、特定の条件をチェックするために Iterator を使用して mElement を反復するループがあります:

for (Iterator<Element> it = mElements.iterator(); it.hasNext();){
    Element element = it.next();

    // Check element's position and other conditions...

    if(element.cFlag){
        mElements.add(new Element("crack",getResources(), (int)touchX,(int)touchY)); // ConcurrentModificationException occurs here
        element.cFlag = false;
    }
}
ログイン後にコピー

ただし、Iterator を使用して反復中に ArrayList を (新しい要素を追加して) 変更すると、 ConcurrentModificationException.

解決策:

この例外を回避するには、追加する必要がある要素を格納する別のリストを作成し、それらをメインのリストに追加することが 1 つのオプションです。反復完了後:

List<Element> thingsToBeAdd = new ArrayList<Element>();
for(Iterator<Element> it = mElements.iterator(); it.hasNext();) {
    Element element = it.next();

    // Check element's position and other conditions...

    if(element.cFlag){
        // Store the new element in a separate list for later addition
        thingsToBeAdd.add(new Element("crack",getResources(), (int)touchX,(int)touchY));
        element.cFlag = false;
    }
}

// Add all elements from the temporary list to the main list
mElements.addAll(thingsToBeAdd );
ログイン後にコピー

代替アプローチ:

もう 1 つのアプローチは、拡張された for-each ループを使用することです。これは、リストのコピーを反復処理して、ConcurrentModificationException:

for (Element element : mElements) {

    // Check element's position and other conditions...

    if(element.cFlag){
        mElements.add(new Element("crack",getResources(), (int)touchX,(int)touchY)); // No ConcurrentModificationException
        element.cFlag = false;
    }
}
ログイン後にコピー
を回避します。

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート