关于java.util.ConcurrentModificationException异常

来源:互联网 发布:英语网络课程推荐 编辑:程序博客网 时间:2024/06/11 03:44

这是阿里的开发规范
这是阿里的开发规范,【强制】
遵守该规范就可以避免该异常。

具体的解决办法:

  1. 用iterator来遍历集合,利用iterator的remove
  2. for循环倒着来遍历集合,再进行remove操作就没问题了

栗子:

import java.util.ArrayList;import java.util.Iterator;import java.util.List;public class Demo1 {    /**     * 不要在 foreach 循环里进行元素的 remove / add 操作。      * remove 元素请使用 Iterator方式     * 如果并发操作,需要对 Iterator 对象加锁。     * @param args     */    public static void main(String[] args) {        List<String> a = new ArrayList<String>();        a.add("2");        a.add("1");        a.add("3");        System.out.println("处理前:\n"+a);        /*1、错误的*/         for (String temp : a) {         if ("3".equals(temp)) {//修改这里的3为2或1查看结果;         a.remove(temp);         }         }        /*2、我就偏爱用for循环*///      for(int i=a.size()-1;i>=0;i--){//          String tmp = a.get(i);//          if("3".equals(tmp)){//              a.remove(tmp);//          }//      }        /*3、规范点*///      Iterator<String> it = a.iterator();//      while (it.hasNext()) {//          String temp = it.next();//          if ("3".equals(temp)) {//              /*a.remove(temp);*///              /*这里调用的是list的remove方法,//              *由于调用list.remove()方法导致modCount//              *和expectedModCount的值不一致。//              *会报ConcurrentModificationException异常//              **///              it.remove();//              /*这里调用的是Iterator的remove方法,可以解决*///          }//      }        System.out.println("处理后:\n"+a);    }}

可以分别替换注释的部分来运行看看;

如果要深究的话可以参考这篇博客
ConcurrentModificationException原因的深究

还有这篇
集合迭代时对集合进行修改抛ConcurrentModificationException

原创粉丝点击