應用程式在 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中文網其他相關文章!