在迭代期間修改 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中文網其他相關文章!