ConcurrentModificationException semasa Mengubah Suai ArrayList Semasa Lelaran
Pengecualian yang dilaporkan ialah ConcurrentModificationException, yang berasal daripada percubaan untuk mengubah suai ArrayList, mElements, manakala mengulanginya.
Di dalam an Pengendali OnTouchEvent, terdapat gelung yang berulang ke atas mElements menggunakan Iterator untuk menyemak keadaan tertentu:
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; } }
Walau bagaimanapun, mengubah suai ArrayList (dengan menambah elemen baharu) sambil mengulanginya menggunakan Iterator boleh menyebabkan ConcurrentModificationException.
Penyelesaian:
Untuk mengelakkan pengecualian ini, satu pilihan ialah mencipta senarai berasingan untuk menyimpan elemen yang perlu ditambah dan menambahkannya ke senarai utama selepas melengkapkan lelaran:
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 );
Alternatif Pendekatan:
Pendekatan lain ialah menggunakan gelung yang dipertingkatkan untuk setiap gelung, yang berulang pada salinan senarai, menghalang 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; } }
Atas ialah kandungan terperinci Bagaimana untuk Mengelakkan ConcurrentModificationException Apabila Mengubah Suai ArrayList Semasa Lelaran?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!