반복 중 ArrayList를 수정하는 동안 ConcurrentModificationException
보고된 예외는 ConcurrentModificationException입니다. 이는 ArrayList, mElements를 수정하려는 시도에서 발생합니다. 반복합니다.
내부 OnTouchEvent 핸들러에는 특정 조건을 확인하기 위해 Iterator를 사용하여 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; } }
그러나 Iterator를 사용하여 반복하는 동안 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 );
대안 접근 방식:
또 다른 접근 방식은 목록의 복사본을 반복하여 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; } }을 방지하는 향상된 for-each 루프를 사용하는 것입니다.
위 내용은 반복 중에 ArrayList를 수정할 때 ConcurrentModificationException을 방지하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!