原文地址: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 并发修改_理解和解决Java并发修改异常ConcurrentModificationException

    your name.jpg 关键字: Java Exception 不知读者在Java开发的过程中有没有遇到类似的异常信息 Exception in thread "main" j ...

  2. Java并发修改异常的源码解析

    1. 什么时候会产生并发修改异常 并发的意思是同时发生,那么其实并发修改的字面意思就是同时修改,通过查看JDK的API我们可以得知,并发修改异常的出现的原因是:当方法检测到对象的并发修改,但不允许这种 ...

  3. php 迭代器迭代中文时重复,3种方式解决iterator迭代器并发修改异常

    3种方式解决iterator迭代器并发修改异常ConcurrentModificationException 在使用迭代器的时候,时长会遇到 ConcurrentModificationExcepti ...

  4. Java并发--ConcurrentModificationException(并发修改异常)异常原因和解决方法

    Java并发--ConcurrentModificationException(并发修改异常)异常原因和解决方法 参考文章: (1)Java并发--ConcurrentModificationExce ...

  5. java迭代器删除元素出异常_java迭代器移除元素出现并发修改异常的原因及解决...

    迭代器(Iterator的对象)主要用于遍历集合,体现的就是迭代器模式. Iterator接口定义了以下四种方法. boolean hasNext():如果集合还没遍历完就返回true. Object ...

  6. java迭代器 异常_java-迭代器并发修改异常

    A:迭代器的并发修改异常 /* * 迭代器的并发修改异常 java.util.ConcurrentModificationException * 就是在遍历的过程中,使用了集合方法修改了集合的长度,不 ...

  7. ConcurrentModificationException 并发修改异常剖析及解决方案

    最近在回头打基础学习Java SE,研究List集合的过程中,遇到了ConcurrentModificationException 并发修改异常.在此记录下遇到问题的原因解析和解决方案.错误千奇百怪, ...

  8. 第三次学JAVA再学不好就吃翔(part79)--并发修改异常产生的原因及解决方案

    学习笔记,仅供参考,有错必纠 文章目录 集合 并发修改异常产生的原因及解决方案 ConcurrentModificationException 解决方案 集合 并发修改异常产生的原因及解决方案 在这个 ...

  9. Java中遍历集合的并发修改异常解决方案

    遍历集合的删除元素的问题 问题引出: 当我们遍历集合从中找出某一批元素并删除的时候, 可能出现一种并发修改异常问题. 哪些变量会存在这个问题? 迭代器遍历集合且直接用集合删除元素的时候可能出现, 例如 ...

最新文章

  1. 阿里首次开源深度学习框架X-Deep Learning
  2. vue-router动态路由示例
  3. Java黑皮书课后题第9章:**9.12(几何:交点)假设两条线段相交。第一条线段的两个端点是(x1, y1)和(x2, y2),第二条线段的两个端点是(x3, y3)和(x4, y4)
  4. 不加载执行js_前端性能优化:preload 预加载页面资源
  5. 从零开始学前端:CSS背景颜色 --- 今天你学习了吗?(CSS:Day09)
  6. 文件包含原理及本地文件包含漏洞演示(本地文件,远程包含文件的测试)
  7. 贝叶斯派的概率图模型概述(总)
  8. 和Keyle一起学ShaderForge - Overview
  9. ESB 企业服务总线
  10. IntelliJ IDEA的maven如何提高下载速度
  11. 一名菜鸟程序员的跳槽经历以及其所感所想(二)
  12. Cobbler自动部署CentOS系统
  13. namenode无法启动,There appears to be a gap in the edit log. We expected txid 10323, but got txid 10324.
  14. 3D建模需要什么电脑配置?什么样的电脑可以用作游戏建模?
  15. 批量制作带LOGO的网址二维码
  16. 利用Python在网上接单,兼职也能月薪过万,真的假的?
  17. 电影《在云端》经典对白翻译
  18. android SurfaceView 拍照时显示参照矩形框
  19. 计算机教师继续教育心得,教师继续教育学习心得体会范文(精选8篇)
  20. docker实现替换镜像

热门文章

  1. javascript worker 多线程 简单示例
  2. 重温目标检测--Faster R-CNN
  3. 膨胀卷积--Multi-scale context aggregation by dilated convolutions
  4. 查询服务器上几张显卡命令
  5. LeetCode 148. Sort List--面试算法题--C++,Python解法
  6. linux 轻量化图形界面,用这13个方法,帮你做出真正轻量化的移动 App 设计
  7. mysql数据库blob区别_MySQL中TEXT与BLOB字段类型的区别
  8. fusioncompute中cpu可以设置的qos参数有哪些?_kubernetes 中 Qos 的设计与实现
  9. 高校计算机通识教育目标,美国高校计算机通识教育研究
  10. android webview java_Android Webview中调用本地java方法