理解和解决Java并发修改异常ConcurrentModificationException(转载)
原文地址: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(转载)相关推荐
- java 并发修改_理解和解决Java并发修改异常ConcurrentModificationException
your name.jpg 关键字: Java Exception 不知读者在Java开发的过程中有没有遇到类似的异常信息 Exception in thread "main" j ...
- Java并发修改异常的源码解析
1. 什么时候会产生并发修改异常 并发的意思是同时发生,那么其实并发修改的字面意思就是同时修改,通过查看JDK的API我们可以得知,并发修改异常的出现的原因是:当方法检测到对象的并发修改,但不允许这种 ...
- php 迭代器迭代中文时重复,3种方式解决iterator迭代器并发修改异常
3种方式解决iterator迭代器并发修改异常ConcurrentModificationException 在使用迭代器的时候,时长会遇到 ConcurrentModificationExcepti ...
- Java并发--ConcurrentModificationException(并发修改异常)异常原因和解决方法
Java并发--ConcurrentModificationException(并发修改异常)异常原因和解决方法 参考文章: (1)Java并发--ConcurrentModificationExce ...
- java迭代器删除元素出异常_java迭代器移除元素出现并发修改异常的原因及解决...
迭代器(Iterator的对象)主要用于遍历集合,体现的就是迭代器模式. Iterator接口定义了以下四种方法. boolean hasNext():如果集合还没遍历完就返回true. Object ...
- java迭代器 异常_java-迭代器并发修改异常
A:迭代器的并发修改异常 /* * 迭代器的并发修改异常 java.util.ConcurrentModificationException * 就是在遍历的过程中,使用了集合方法修改了集合的长度,不 ...
- ConcurrentModificationException 并发修改异常剖析及解决方案
最近在回头打基础学习Java SE,研究List集合的过程中,遇到了ConcurrentModificationException 并发修改异常.在此记录下遇到问题的原因解析和解决方案.错误千奇百怪, ...
- 第三次学JAVA再学不好就吃翔(part79)--并发修改异常产生的原因及解决方案
学习笔记,仅供参考,有错必纠 文章目录 集合 并发修改异常产生的原因及解决方案 ConcurrentModificationException 解决方案 集合 并发修改异常产生的原因及解决方案 在这个 ...
- Java中遍历集合的并发修改异常解决方案
遍历集合的删除元素的问题 问题引出: 当我们遍历集合从中找出某一批元素并删除的时候, 可能出现一种并发修改异常问题. 哪些变量会存在这个问题? 迭代器遍历集合且直接用集合删除元素的时候可能出现, 例如 ...
最新文章
- 阿里首次开源深度学习框架X-Deep Learning
- vue-router动态路由示例
- Java黑皮书课后题第9章:**9.12(几何:交点)假设两条线段相交。第一条线段的两个端点是(x1, y1)和(x2, y2),第二条线段的两个端点是(x3, y3)和(x4, y4)
- 不加载执行js_前端性能优化:preload 预加载页面资源
- 从零开始学前端:CSS背景颜色 --- 今天你学习了吗?(CSS:Day09)
- 文件包含原理及本地文件包含漏洞演示(本地文件,远程包含文件的测试)
- 贝叶斯派的概率图模型概述(总)
- 和Keyle一起学ShaderForge - Overview
- ESB 企业服务总线
- IntelliJ IDEA的maven如何提高下载速度
- 一名菜鸟程序员的跳槽经历以及其所感所想(二)
- Cobbler自动部署CentOS系统
- namenode无法启动,There appears to be a gap in the edit log. We expected txid 10323, but got txid 10324.
- 3D建模需要什么电脑配置?什么样的电脑可以用作游戏建模?
- 批量制作带LOGO的网址二维码
- 利用Python在网上接单,兼职也能月薪过万,真的假的?
- 电影《在云端》经典对白翻译
- android SurfaceView 拍照时显示参照矩形框
- 计算机教师继续教育心得,教师继续教育学习心得体会范文(精选8篇)
- docker实现替换镜像
热门文章
- javascript worker 多线程 简单示例
- 重温目标检测--Faster R-CNN
- 膨胀卷积--Multi-scale context aggregation by dilated convolutions
- 查询服务器上几张显卡命令
- LeetCode 148. Sort List--面试算法题--C++,Python解法
- linux 轻量化图形界面,用这13个方法,帮你做出真正轻量化的移动 App 设计
- mysql数据库blob区别_MySQL中TEXT与BLOB字段类型的区别
- fusioncompute中cpu可以设置的qos参数有哪些?_kubernetes 中 Qos 的设计与实现
- 高校计算机通识教育目标,美国高校计算机通识教育研究
- android webview java_Android Webview中调用本地java方法