Rumah > Java > javaTutorial > Bagaimana untuk Mengelakkan ConcurrentModificationException Apabila Menambah pada ArrayList Semasa Lelaran?

Bagaimana untuk Mengelakkan ConcurrentModificationException Apabila Menambah pada ArrayList Semasa Lelaran?

Patricia Arquette
Lepaskan: 2024-12-07 04:32:15
asal
905 orang telah melayarinya

How to Avoid ConcurrentModificationException When Adding to an ArrayList During Iteration?

Pengecualian Pengubahsuaian Serentak: Menambah pada ArrayList

Masalah

Sesuatu aplikasi menemui ConcurrentModificationException apabila mengubah suai ArrayList (mElements) dalam kaedah OnTouchEvent. Kod ini berulang ke atas mElements menggunakan Iterator, dan apabila peristiwa sentuhan tertentu, cuba menambah elemen baharu pada senarai. Ini berlaku dalam blok (mElements) yang disegerakkan.

Pengecualian

java.util.ConcurrentModificationException
Salin selepas log masuk

Punca

ConcurrentModificationException berlaku kerana ArrayList sedang diubah suai (dengan menambahkan elemen) semasa ia sedang dilalui menggunakan Iterator. Iterator menjangkakan koleksi asas kekal tidak berubah semasa lelaran. Walau bagaimanapun, menambah elemen pada senarai semasa lelaran melanggar jangkaan ini.

Penyelesaian

Untuk menyelesaikan pengecualian, perlu menambah elemen baharu pada senarai selepas lelaran selesai. Ini boleh dicapai dengan menggunakan Senarai tambahan untuk menyimpan elemen baharu dan menambahkannya ke senarai mElements utama selepas lelaran.

List<Element> thingsToBeAdd = new ArrayList<Element>();
for (Iterator<Element> it = mElements.iterator(); it.hasNext(); ) {
    Element element = it.next();
    // ...
    if (element.cFlag) {
        thingsToBeAdd.add(new Element("crack", getResources(), (int) touchX, (int) touchY));
        element.cFlag = false;
    }
}
mElements.addAll(thingsToBeAdd);
Salin selepas log masuk

Pilihan Tambahan

Sebagai alternatif kepada penyelesaian di atas , pertimbangkan untuk menggunakan sintaks untuk setiap gelung yang dipertingkatkan, yang mengelakkan keperluan untuk Iterator dan mengendalikan penyegerakan secara dalaman:

for (Element element : mElements) {
    // ...
    if (element.cFlag) {
        thingsToBeAdd.add(new Element("crack", getResources(), (int) touchX, (int) touchY));
        element.cFlag = false;
    }
}
mElements.addAll(thingsToBeAdd);
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimana untuk Mengelakkan ConcurrentModificationException Apabila Menambah pada 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