1. 程式人生 > >java.util.ConcurrentModificationException 異常

java.util.ConcurrentModificationException 異常

    public static void main(String[] args) {
        ArrayList<String> aList = new ArrayList<String>();
        aList.add("bbc");
        aList.add("abc");
        aList.add("ysc");
        aList.add("saa");
        System.out.println("移除前:" + aList);

        Iterator<String> it = aList.iterator();
        while (it.hasNext()) {
            if ("abc".equals(it.next())) {
                aList.remove("abc");
            }
        }
        System.out.println("移除後:" + aList);
    }

來看看,這段程式碼為什麼會丟擲 “java.util.ConcurrentModificationException” 異常,為了防止元素出現不可預期的結果,為什麼會出現不可以預期的結果:

在Java中,迭代器是採用遊標方式來訪問集合中元素的:

0 1 2 3 4
a b c d e

當迭代器訪問到cursor=3,元素:d時,此時元素下標cursor=cursor+1, 其值=4,這時候出現刪除操作, list.remove(3); 集合變成如下形式:

0 1 2 3 4
a b c e null

此時呼叫next()方法,返回cursor=4, 指向的元素,其值為null, 不符合期望值e, 所以java中需要避免這種不可預期的結果出現。所以就會丟擲java.util.ConcurrentModificationException?
至於如何實現,請參考JDK原始碼

上述程式碼正確刪除方法,採用迭代器來刪除

    public static void main(String[] args) {
        ArrayList<String> aList = new ArrayList<String>();
        aList.add("bbc");
        aList.add("abc");
        aList.add("ysc");
        aList.add("saa");
        System.out.println("移除前:" + aList);

        Iterator<String> it = aList.iterator();
        while (it.hasNext()) {
            if ("abc".equals(it.next())) {
                it.remove();
            }
        }
        System.out.println("移除後:" + aList);
    }