关闭

java.util.ConcurrentModificationException 异常

标签: arraylistjava异常
244人阅读 评论(0) 收藏 举报
分类:

参考自 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);
    }
}

输出为:
这里写图片描述

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:157484次
    • 积分:1891
    • 等级:
    • 排名:千里之外
    • 原创:66篇
    • 转载:24篇
    • 译文:1篇
    • 评论:6条
    最新评论