理解和解决Java并发修改异常:ConcurrentModificationException

參考文獻:https://www.jianshu.com/p/f3f6b12330c1   

文獻来源:简书

 

关键字: Java Exception
遇到异常信息Exception in thread "main" java.util.ConcurrentModificationException。

假设我们要实现这样一个例子: 判断集合里面有没有"Bi-Hu"这个元素,如果有,就在其后面添加一个"向北"元素

import java.util.*;

public class Main {

    public static void main(String[] args) {
        List list = new ArrayList();
        list.add("a");
        list.add("b");
        list.add("Bi-Hu");
        list.add("a");
        list.add("a");

        Iterator iterator = list.iterator();
        while(iterator.hasNext()){

            String s = (String) iterator.next();
            if ("Bi-Hu".equals(s)){
                list.add("向北");
            }

        }

    }
}
那么它是会出现并发异常的 , 因为呢:


  • ConcurrentModificationException:当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常。
  • 产生的原因:
    迭代器是依赖于集合而存在的,在判断成功后,集合的中新添加了元素,而迭代器却不知道,所以就报错了,这个错叫并发修改异常。
  • 简单描述就是:迭代器遍历元素的时候,通过集合是不能修改元素的。

  解决方案:

  1.用 for 循环代替 while    增强型for循环也是会报错的

  2.不要用 Iterator 换成 ListIterator 

 

这里注意的是:

1.用 ListIterator 后面是 list.listIterator();     并不是 list.Iterator();   即:用 Iterator 时 用  list.Iterator() 获取实例 , 用 ListIterator 时 用  list.ListIterator () 获取实例。

2.用list.listIterator时,添加元素时不能用实例来添加 只能通过list迭代器的方法,即:

listIterator.add("Bi-Hu");

   

import java.util.*;

public class Main {

    public static void main(String[] args) {
        List list = new ArrayList();
        list.add("a");
        list.add("b");
        list.add("Bi-Hu");
        list.add("a");
        list.add("a");

        ListIterator listIterator = list.listIterator();
        while (listIterator.hasNext()) {
            String str = (String) listIterator.next();
            if (str.equals("Bi-Hu")) {
                listIterator.add("向北");
            }
        }

        System.out.println(list);
        //[a, b, Bi-Hu, 向北, a, a]  可以看到 是在 Bi-Hu 后添加进去
    }
}

 

  TiPS: 其实吧 : 

listIterator 比 Iterator 功能方法多得多 ,这就要靠你自己去看API了!     不看Api 还学什么编程啊...

 

总结: 迭代器遍历元素的时候,通过集合是不能修改元素的。

posted @ 2021-04-17 16:40  咸瑜  阅读(271)  评论(0编辑  收藏  举报