天天看点

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());