原文地址:https://www.jianshu.com/p/f3f6b12330c1

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

不知读者在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);
}
}

赠人玫瑰,手有余香。

理解和解决Java并发修改异常ConcurrentModificationException(转载)的更多相关文章

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

    參考文獻:https://www.jianshu.com/p/f3f6b12330c1 文獻来源:简书 关键字: Java Exception遇到异常信息Exception in thread &qu ...

  2. 集合框架之——迭代器并发修改异常ConcurrentModificationException

    问题: 我有一个集合,如下,请问,我想判断里面有没有"world"这个元素,如果有,我就添加一个"javaee"元素,请写代码实现. 使用普通迭代器出现的异常: ...

  3. 大杂烩 -- Iterator 并发修改异常ConcurrentModificationException

    基础大杂烩 -- 目录 大杂烩 -- Java中Iterator的fast-fail分析 大杂烩 -- Iterator 和 Iterable 区别和联系 问题: 在集合中,判断里面有没有" ...

  4. 并发修改异常ConcurrentModificationException

    1.简述:在使用 迭代器对象遍历集合时,使用集合对象修改集合中的元素导致出现异常 public static void main(String[] args) { List<Integer> ...

  5. ConcurrentModificationException(并发修改异常)的解决

    [异常解释] ConcurrentModificationException:当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常.[产生的原因] 迭代器是依赖于集合而存在的,在判断成功后,集合 ...

  6. ConcurrentModificationException 集合并发修改异常 解决

    import java.util.ArrayList; import java.util.List; import java.util.ListIterator; /** * 问题? * 有一个集合, ...

  7. 【Java笔记】以并发修改异常为例总结的出错解决办法

    先来看出错代码: /*需求: 遍历已有集合 如果在集合中发现存在字符串元素"world" 则在"world"后添加元素"javaee" */ ...

  8. java 15 - 8 集合框架(并发修改异常的产生原因以及解决方案)

    问题?   我有一个集合,如下,请问,我想判断里面有没有"world"这个元素,如果有,我就添加一个"javaee"元素,请写代码实现.  面试题: Concu ...

  9. Java基础知识强化之集合框架笔记19:List集合迭代器使用之 并发修改异常的产生原因 以及 解决方案

    1. 我有一个集合,如下,请问,我想判断里面有没有"world"这个元素,如果有,我就添加一个"javaee"元素,请写代码实现. ConcurrentModi ...

随机推荐

  1. node加密

    var crypto = require('crypto'); //md5加密 exports.md5 = function (str) { var md5sum = crypto.createHas ...

  2. 轻松理解Redux原理及工作流程

    轻松理解Redux原理及工作流程 Redux由Dan Abramov在2015年创建的科技术语.是受2014年Facebook的Flux架构以及函数式编程语言Elm启发.很快,Redux因其简单易学体 ...

  3. Ubuntu安装软件时提示依赖项配置错误

    在终端中使用dpkg安装软件时有时会出现依赖项配置错误的情况, 解决方法是使用指令 sudo apt-get install -f 安装Ubuntu 16.04新系统不再配有的缺失依赖项,之后再次输入 ...

  4. Java中类加载过程和对象创建过程

    类加载过程: 1, JVM会先去方法区中找有没有相应类的.class存在.如果有,就直接使用:如果没有,则把相关类的.class加载到方法区 2, 在.class加载到方法区时,会分为两部分加载:先加 ...

  5. SourceTree安装教程和破解教程

    SourceTree破解版是一款非常实用的编程工具,这是一款专业的Git和Hg客户端,界面简洁,操作简单易上手,是开发者的必备工具,欢迎大家来绿色资源网下载体验!SourceTree是一款免费的Git ...

  6. Charles抓包(未完待续)

    Charles是在 Mac 下常用的网络封包截取工具,在做移动开发时,我们为了调试与服务器端的网络通讯协议,常常需要截取网络封包来分析. Charles 通过将自己设置成系统的网络访问代理服务器,使得 ...

  7. python每日笔记

    9.28 查看python包路径: sys.path 9.4  sorted高级用法: >>> class Student: def __init__(self, name, gra ...

  8. html的文字样式、下行线、删除线、上标、下标等实现方式

    先看效果如下: 代码如下: <del>del标签删除线</del><br/> <strike>strike标签删除线</strike>< ...

  9. set non-stop on

    # Enable the async interface. set target-async 1 # If using the CLI, pagination breaks non-stop. set ...

  10. 制作chrome插件/扩展程序,禁止谷歌浏览器访问某些网站

    简单地说,浏览器插件,可以大大的扩展你的浏览器的功能.包括但不仅限于这些功能: 捕捉特定网页的内容 捕捉HTTP报文 捕捉用户浏览动作,改变浏览器地址栏/起始页/书签/Tab等界面元素的行为 与别的站 ...