zoukankan      html  css  js  c++  java
  • 理解和解决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 还学什么编程啊...

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

    本文来自博客园,作者:咸瑜,转载请注明原文链接:https://www.cnblogs.com/bi-hu/p/14671137.html

  • 相关阅读:
    四则运算3
    结对编程
    2016年秋季-软件需求分析-UML图
    2016年秋季-学习进度条
    2016年秋季-学习进度条
    2016年秋季-《UML大战需求分析》-阅读笔记1
    2016年秋季-课堂练习1-Liz开发问题账户分析系统
    2016年秋季-《UML大战需求分析》-个人阅读计划
    2016年秋季-软件需求与分析-基本知识
    用户体验
  • 原文地址:https://www.cnblogs.com/bi-hu/p/14671137.html
Copyright © 2011-2022 走看看