天天看點

java.util.ConcurrentModificationExceptionConcurrentModificationException

ConcurrentModificationException

異常Log:

産生異常的代碼:

ArrayList al = new ArrayList();
//  集合操作
al.add("java01");
al.add("java02");
al.add("java03");

//  疊代器操作 
Iterator it = al.iterator();
while(it.hasNext()) {
   // java.util.ConcurrentModificationException
    Object obj = it.next();
    if (obj.equals("java02")) {
        //  集合操作
        al.remove("java02");
    }
}
           

原因:

操作元素的方法有兩種:1. 集合 2. 疊代器

上面while循環的代碼中同時使用了兩種方法并發操作元素(使用Iterator查詢元素,使用ArrayList删除元素),會産生安全隐患。Iterator不允許這樣操作。

解決辦法:

隻用其中一種方式操作。

if (obj.equals("java02")) {
        it.remove();
}
           

如果想要其他的操作如添加、修改等,就需要使用其子接口,即ListIterator。 該接口隻能通過List集合的listIterator()擷取。

ArrayList al = new ArrayList();
al.add("java01");
al.add("java02");
al.add("java03");

ListIterator li = al.listIterator();
while(li.hasNext()) {
    Object obj = li.next();
        if (obj.equals("java02")) {
        li.add("java09");
    }
}

System.out.println("hasNext(): " + li.hasNext());
System.out.println("hasPrevious(): " + li.hasPrevious());