ConcurrentModificationException untuk ArrayList
Pertimbangkan kod berikut:
private String toString(List<DrugStrength> aDrugStrengthList) { StringBuilder str = new StringBuilder(); for (DrugStrength aDrugStrength : aDrugStrengthList) { if (!aDrugStrength.isValidDrugDescription()) { aDrugStrengthList.remove(aDrugStrength); } } str.append(aDrugStrengthList); if (str.indexOf("]") != -1) { str.insert(str.lastIndexOf("]"), "\n " ); } return str.toString(); }
Apabila dilaksanakan, kod ini mencetuskan ConcurrentModificationException. Pengecualian ini berlaku kerana mengubah suai ArrayList semasa mengulanginya menggunakan a untuk setiap gelung adalah tidak selamat.
Untuk menyelesaikan isu ini, gantikan bagi setiap gelung dengan gelung lelaran:
for (Iterator<DrugStrength> it = aDrugStrengthList.iterator(); it.hasNext(); ) { DrugStrength aDrugStrength = it.next(); if (!aDrugStrength.isValidDrugDescription()) { it.remove(); } }
Satu iterator menyediakan cara yang selamat untuk mengalih keluar elemen daripada ArrayList sambil mengulanginya. Ia mengekalkan kursor yang menjejaki kedudukan semasa dalam senarai, memastikan pengalihan keluar elemen tidak menjejaskan proses lelaran.
Atas ialah kandungan terperinci Mengapa Mengubah Suai ArrayList Semasa Gelung Untuk-Setiap Menyebabkan ConcurrentModificationException?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!