首頁 >Java >java教程 >迭代期間加入 ArrayList 時如何避免 ConcurrentModificationException?

迭代期間加入 ArrayList 時如何避免 ConcurrentModificationException?

Patricia Arquette
Patricia Arquette原創
2024-12-07 04:32:15920瀏覽

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

並發修改異常:加入到 ArrayList

問題

應用程式在 OnTouchEvent 方法中修改 ArrayList (mElements) 時遇到 ConcurrentModationException。程式碼使用迭代器迭代 mElements,並根據特定的觸控事件嘗試將新元素新增至清單。這發生在synchronized(mElements)區塊內。

異常

java.util.ConcurrentModificationException

原因

發生ConcurrentModificationException是因為ArrayList在被修改時(透過加入元素)使用迭代器進行遍歷。迭代器期望底層集合在迭代期間保持不變。但是,在迭代期間向列表添加元素違反了此期望。

解決方案

要解決該異常,需要在迭代完成後將新元素添加到列表中。這可以透過使用額外的 List 來保存新元素並在迭代後將它們新增至主 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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn