在迭代期间修改 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中文网其他相关文章!