反復中に ArrayList を変更する際の ConcurrentModificationException
報告された例外は ConcurrentModificationException であり、ArrayList、mElements を変更しようとしたときに発生します。
内部OnTouchEvent ハンドラーには、特定の条件をチェックするために Iterator を使用して mElement を反復するループがあります:
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; } }
ただし、Iterator を使用して反復中に ArrayList を (新しい要素を追加して) 変更すると、 ConcurrentModificationException.
解決策:
この例外を回避するには、追加する必要がある要素を格納する別のリストを作成し、それらをメインのリストに追加することが 1 つのオプションです。反復完了後:
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 );
代替アプローチ:
もう 1 つのアプローチは、拡張された for-each ループを使用することです。これは、リストのコピーを反復処理して、ConcurrentModificationException:
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 中国語 Web サイトの他の関連記事を参照してください。