java.util.ConcurrentModificationException 异常
2016-05-30 15:03
751 查看
参考自 Java ConcurrentModificationException异常原因和解决方法
异常:
原因为调用 ArrayList 的remove() 方法时,只修改了 modCount 变量的值,而迭代 ArrayList 时的next() 方法要判断 modCount 和 expectCount 的值是否相等,不相等则抛出 ConcurrentModificationException 异常。
ArrayList 的 remove() 方法:
ArrayList 的内部类 Itr 的 next() 方法:
该方法内 expectedModCount = modcount; 使得这两个变量的值相同,可以正常迭代。
代码如下:
输出为:
一、异常再现
导致异常代码:@Test public void d() { List<String> l = new ArrayList<>(); l.add("a"); l.add("b"); l.add("c"); for (String s : l) { if ("a".equals(s)) { l.remove(s); } } }
异常:
二、原因
ArrayList 在迭代的时候,对其进行修改会抛出 java.util.ConcurrentModificationException 异常。原因为调用 ArrayList 的remove() 方法时,只修改了 modCount 变量的值,而迭代 ArrayList 时的next() 方法要判断 modCount 和 expectCount 的值是否相等,不相等则抛出 ConcurrentModificationException 异常。
ArrayList 的 remove() 方法:
ArrayList 的内部类 Itr 的 next() 方法:
三、解决
使用 Iterator 迭代容器,并且使用ArrayList 的内部类 Itr 的 remove() 方法:该方法内 expectedModCount = modcount; 使得这两个变量的值相同,可以正常迭代。
代码如下:
@Test public void d() { List<String> l = new ArrayList<>(); l.add("a"); l.add("b"); l.add("c"); Iterator<String> iter = l.iterator(); while (iter.hasNext()) { String s = iter.next(); if ("a".equals(s)) { iter.remove(); } } for (String s : l) { System.out.println(s); } }
输出为:
相关文章推荐
- java线程池参数说明及队列拒绝策略
- 深入解析 Spring MVC的配置文件
- java中的集合
- spring注解使用及区别
- java集合和scala集合互转
- mac myeclipse2015安装SVN插件
- eclipse 快捷键大全,eclipse查找类,文件,添加注释
- 用java代码把docx转换成pdf文件
- 使用POI导入EXCEL报java.lang.IncompatibleClassChangeError
- JAVA诊断监控工具
- JAVA环境下的selenium脚本
- (转载)#java读书笔记#IO流
- java设计模式之——代理模式
- java反射中getDeclaredMethods和getMethods的区别
- java装饰器模式
- 二分排序(java)
- 【Spring4揭秘 基础3】统一抽象资源---Resource
- springmvc拦截器实现自动登录
- spring BeanUtils复制bean后字段无直问题
- scala调用java的方法,返回了一个对象链表List<Student>,在scala中遍历该链表获取指定Student的名字name