1. 程式人生 > >JAVA--遍歷List刪除元素報ConcurrentModificationException

JAVA--遍歷List刪除元素報ConcurrentModificationException

直接上程式碼

ArrayList<Integer> list = new ArrayList<>();

    {
        list.add(1);
        list.add(3);
        list.add(2);
        list.add(4);
        list.add(5);
        list.add(6);
        list.add(7);
    }

    @Test
    public void testRemoveListElement() {
        for (int i : list) {
            if (i % 2 == 0) {
                list.remove(i);
            }
        }
        // java.util.ConcurrentModificationException
    }

目的是想刪去集合中所有的偶數。

但是執行卻拋了ConcurrentModificationException錯誤

 

分析原因

根據報錯的資訊,可以看到是因為modCount != expectedModCount導致的。

再檢視859行,發現是在next()方法呼叫的checkForComodification();

然後我們再到ArrayList中檢視remove的原始碼,發現刪除一個元素的時候會做modCount++操作。

 

解決方案一

用多一個newList,新增符合條件的元素(即原判斷條件取反),最後返回這個newList即可

@Test
    public void testRemoveListElement2() {
        ArrayList<Integer> newList = new ArrayList<>();
        for (int i : list) {
            // 條件取反
            if (i % 2 != 0) {
                newList.add(i);
            }
        }
    }

解決方案二

不適用foreach的形式,使用fori

@Test
    public void testRemoveListElement1() {
        for (int i = 0; i < list.size(); i++) {
            if (list.get(i) % 2 == 0) {
                list.remove(i);
                i--;
            }
        }
    }

同時這裡要注意每次刪除元素要把計數的i往前移一個,即i--;