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
Lepaskan: 2024-11-30 20:25:13
asal
935 orang telah melayarinya

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;
    }
}
Salin selepas log masuk

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 );
Salin selepas log masuk

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;
    }
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan