首页 >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,源自尝试修改 ArrayList、mElements,而迭代它。

在 OnTouchEvent 处理程序内,有一个循环使用迭代器迭代 mElements 以检查特定条件:

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;
    }
}

但是,在使用迭代器迭代 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-each 循环,它迭代列表的副本,从而防止并发修改异常:

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn