Rumah >Java >javaTutorial >Bagaimana untuk Mengelakkan ConcurrentModificationException Apabila Mengubah Suai ArrayList Semasa Lelaran?

Bagaimana untuk Mengelakkan ConcurrentModificationException Apabila Mengubah Suai ArrayList Semasa Lelaran?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-30 20:25:13994semak imbas

How to Avoid ConcurrentModificationException When Modifying an ArrayList During Iteration?

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn