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

  • 相关阅读:
    84. Largest Rectangle in Histogram (Solution 2)
    84. Largest Rectangle in Histogram (Solution 1)
    73. Set Matrix Zeroes
    【JavaScript】Symbol 静态方法
    【JavaScript】Date
    【JavaScript】Math
    725. Split Linked List in Parts把链表分成长度不超过1的若干部分
    791. Custom Sort String字符串保持字母一样,位置可以变
    508. Most Frequent Subtree Sum 最频繁的子树和
    762. Prime Number of Set Bits in Binary Representation二进制中有质数个1的数量
  • 原文地址:https://www.cnblogs.com/bi-hu/p/14671137.html
Copyright © 2011-2022 走看看