关闭

Java并发修改错误ConcurrentModificationException分析

56人阅读 评论(0) 收藏 举报

关键字: Java Exception
不知读者在Java开发的过程中有没有遇到类似的异常信息 Exception in thread "main" java.util.ConcurrentModificationException, 下面小编简单介绍异常原因以及这种异常的改进方法,内容很简单,有什么问题还望指正。

假设我们要实现这样一个例子: 判断集合里面有没有"world"这个元素,如果有,就添加一个"javaee"元素

出现异常的代码如下:

import java.util.ArrayList;
import java.util.Iterator;

public class Test {

    public static void main(String[] args) {
        ArrayList<String> array = new ArrayList<String>();

        // 创建并添加元素
        array.add("hello");
        array.add("world");
        array.add("java");
        Iterator it = array.iterator();
        while (it.hasNext()) {
            String s = (String) it.next();
            if ("world".equals(s)) {
                array.add("javaee");
            }
        }
    }
}

1.异常解释

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

2.下面用两种方法去解决这个异常

import java.util.ArrayList;

public class Test {

    public static void main(String[] args) {
        ArrayList<String> array = new ArrayList<String>();

        // 创建并添加元素
        array.add("hello");
        array.add("world");
        array.add("java");
        // 方式1:迭代器迭代元素,迭代器修改元素
        // 而Iterator迭代器却没有添加功能,所以我们使用其子接口ListIterator
        // ListIterator lit = array.listIterator();
        // while (lit.hasNext()) {
        // String s = (String) lit.next();
        // if ("world".equals(s)) {
        // lit.add("javaee");
        // }
        // }
        // System.out.println("list1:" + array);
        // 方式2:集合遍历元素,集合修改元素(普通for)
         for (int x = 0; x < array.size(); x++) {
         String s = (String) array.get(x);
         if ("world".equals(s)) {
         array.add("javaee");
         }
         }

         System.out.println("list2:" + array);

        // 方式3:增强for循环
        // 增强for循环写的话会报同样的错误,因为它本身就是用来替代迭代器的
        // for (String s : array) {
        // if ("world".equals(s)) {
        // array.add("javaee");
        // }
        // }
        // System.out.println("list3:" + array);
    }
}


作者:RookieDay
链接:http://www.jianshu.com/p/f3f6b12330c1
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
0
0
查看评论

Java并发修改错误ConcurrentModificationException分析

1. 介绍 并发修改ConcurrentModificationException错误是开发中一个常见错误,多发生在对一个Collection边遍历边做影响size变化的操作中,下面以ArrayList为例分析ConcurrentModificationException错误。2. 分析 Ar...
  • wchicho
  • wchicho
  • 2016-07-22 10:17
  • 4450

关于java集合的遍历以及ConcurrentModificationException(并发操作异常)

遍历集合的常用方法以及并发操作异常
  • canot
  • canot
  • 2015-12-22 16:08
  • 2102

Android并发修改异常:java.util.ConcurrentModificationException

Android并发修改异常:java.util.ConcurrentModificationException 异常原因……分析解决……个人理解……部分异常代码示例……
  • Sun_2134
  • Sun_2134
  • 2015-02-10 17:43
  • 1909

JDK容器与并发—Queue—PriorityQueue

概述       基于优先堆的无界优先队列,非线程安全。 1)add、offer、remove、poll的时间复杂度为O(log(n));remove(Object)、contains(Object)为线性时间;peek、element、size为固定时间。 数据结构 ...
  • Architect0719
  • Architect0719
  • 2016-08-28 10:31
  • 799

Java并发编程系列之二十六:ConcurrentModificationException

在多线程程序的编写中,经常能遇到ConcurrentModificationException这个异常,这个异常的意思是指出现了并发修改的情况,为了降低对程序的性能的影响,Java开发者将捕获的这种错误以“善意”的方式进行提醒。这种异常一般在对容器的元素遍历的过程中出现了对容器的写操作(包括增加、修...
  • u011116672
  • u011116672
  • 2016-04-08 14:48
  • 4441

map遍历删除异常:ConcurrentModificationException

1. map集合单个删除此时,一般都不会出问题,直接 remove(key) 2. map集合遍历删除多个出现 ConcurrentModificationException
  • baidu_37107022
  • baidu_37107022
  • 2017-06-21 20:03
  • 750

JAVA ConcurrentModificationException并发修改异常

1. 问题描述 Android或者Java代码中,我们通常会对集合进行操作,所以有时一不小心就出现了ConcurrentModificationException异常.为了更好的讲解这个问题。 代码实现的功能是“我有一个集合,我想判断里面有没有"world"这个元素,...
  • xiaoxiangyuhai
  • xiaoxiangyuhai
  • 2017-09-22 17:02
  • 93

Java并发修改异常ConcurrentModificationException

我们先看下面的代码public class Demo { public static void main(String[] args) { ArrayList<String> list = new ArrayList<>(); list...
  • Small_Lee
  • Small_Lee
  • 2017-05-26 16:39
  • 125

ConcurrentModificationException并发修改异常

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 ...
  • awhip9
  • awhip9
  • 2016-10-19 20:43
  • 162

ConcurrentModificationException:并发的修改错误(常见于集合)

在下在对List集合的遍历中,出现了异常,类型为:ConcurrentModificationException(并发的修改错误) 错误情况 错误原因:在遍历一个集合的时候,给这个集合又增加了新的元素。 解决方法:不增加新的元素,或者使用迭代器来进行add、remove等操作 举例: 注:...
  • qijingpei
  • qijingpei
  • 2015-12-20 13:53
  • 237
    个人资料
    • 访问:772次
    • 积分:26
    • 等级:
    • 排名:千里之外
    • 原创:0篇
    • 转载:10篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档