您的位置:首页 > 编程语言 > Java开发

java.util.ConcurrentModificationException 异常

2016-05-30 15:03 751 查看
参考自 Java ConcurrentModificationException异常原因和解决方法

一、异常再现

导致异常代码:

@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);
}
}


输出为:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: