首頁 >Java >java教程 >在迭代過程中修改ArrayList時如何避免ConcurrentModificationException?

在迭代過程中修改ArrayList時如何避免ConcurrentModificationException?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-30 20:25:13917瀏覽

How to Avoid ConcurrentModificationException When Modifying an ArrayList During Iteration?

在迭代期間修改 ArrayList 時出現 ConcurrentModificationException

報告的異常是 ConcurrentModificationException,

報告的異常是 ConcurrentModificationException,而源自於它。

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;
    }
}
在OnTouchEvent 處理程序內,有一個循環使用迭代器迭代mElements 以檢查特定條件:

但是,在使用迭代器迭代ArrayList 時修改ArrayList(透過新增元素)可能會導致ConcurrentModificationException。

解決方案:

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 );
避免這種情況例外,一種選擇是創建一個單獨的列表來存儲需要添加的元素,並在完成迭代後將其附加到主列表:

替代方法:

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;
    }
}
另一種方法是使用增強的 for-each 循環,它迭代列表的副本,從而防止並發修改異常:

以上是在迭代過程中修改ArrayList時如何避免ConcurrentModificationException?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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