java中的ConcurrentModificationException是什么异常?在哪些场景下会报该异常?
在软件构造实验Lab2的ConcreteVerticesGraph里,需要我们编写remove()方法。移除一个点没有别的方法,只有遍历集合vertices(),找到该点并移除。

当时我没有写上红框中的break,出现了ConcurrentModificationException的报错。写实验时没有仔细深究,上网搜索也没有看明白,写出break也是机缘巧合下想到了,后来搜索资料,详细地了解了一下这个报错。
异常简介
ConcurrentModificationException是基于java集合中的 快速失败(fail-fast) 机制产生的,在使用迭代器遍历一个集合对象时,如果遍历过程中对集合对象的内容进行了增删改,就会抛出该异常。
快速失败机制使得java的集合类不能在多线程下并发修改,也不能在迭代过程中被修改。
抛出异常的原因
在实验中,我们使用ArrayList的remove方法遍历并移除元素。
此时会抛出异常:
Exception in thread “main” java.util.ConcurrentModificationException
参考ArrayList的源码中关于remove的片段
1 public void remove() {
2 if (lastRet < 0)
3 throw new IllegalStateException();
4 checkForComodification();
5
6 try {
7 ArrayList.this.remove(lastRet);
8 cursor = lastRet;
9 lastRet = -1;
10 expectedModCount = modCount;
11 } catch (IndexOutOfBoundsException ex) {
12 throw new ConcurrentModificationException();
13 }
14 }
15 final void checkForComodification() {
16 if (modCount != expectedModCount)
17 throw new ConcurrentModificationException();
18 }
remove会检测是否有修改,判断依据为modCount != expectedModCount,每当变更列表,都会改变modCount的值,如果检测到modCount != expectedModCount,那么就会抛出Concurrent Modification Exception。
foreach循环遍历集合,实际上隐式调用了迭代器遍历,同样调用集合的remove或add等方法会抛异常;
解决方案
1.使用Iterator提供的remove方法,用于删除当前元素。

2.新建一个集合存放要删除的元素,之后统一删除。

3.不使用iterator遍历,但是这里要注意移除了一个元素,索引i也随之改变。

参考博客:
java中的ConcurrentModificationException是什么异常?在哪些场景下会报该异常?的更多相关文章
- java中对final关键字的理解以及使用场景
谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法.
- Disruptor框架中生产者、消费者的各种复杂依赖场景下的使用总结
版权声明:原创作品,谢绝转载!否则将追究法律责任. Disruptor是一个优秀的并发框架,可以实现单个或多个生产者生产消息,单个或多个消费者消息,且消费者之间可以存在消费消息的依赖关系.网上其他博客 ...
- java中的ConcurrentModificationException异常
先看这样一段代码: List<String> list = new ArrayList<String>(); list.add("1"); list.add ...
- java中字符串太长,怎么自动换到下一行
直接在中间代码出按回车
- Java中单列集合List排序的真实应用场景
一.需求描述 最近产品应客户要求提出了一个新的需求,有一个列表查询需要按照其中的多列进行排序. 二.需求分析 由于数据总量不多,可以全部查询出来,因此我就考虑使用集合工具类Collections.so ...
- java中异常的面试
https://blog.csdn.net/qq_36523638/article/details/79363652 1) Java中的检查型异常和非检查型异常有什么区别? 这又是一个非常流行的Jav ...
- Java中运行时异常和非运行时异常什么鬼?
Java中的异常分类 RuntimeException(也称unchecked exceptions,运行时异常) 就是我们在开发中测试功能时程序终止,控制台出现的异常.(一般来说,出现运行时异常基本 ...
- 夯实Java基础系列10:深入理解Java中的异常体系
目录 为什么要使用异常 异常基本定义 异常体系 初识异常 异常和错误 异常的处理方式 "不负责任"的throws 纠结的finally throw : JRE也使用的关键字 异常调 ...
- java中的异常体系?throw和throws的区别?
一.java中的异常体系 Thorwable类(表示可抛出)是所有异常和错误的超类,两个直接子类为Error和Exception,分别表示错误和异常.其中异常类Exception又分为运行时异常(Ru ...
- java 中的异常处理
一. 异常的概念和Java异常体系结构 异常是程序运行过程中出现的错误.本文主要讲授的是Java语言的异常处理.Java语言的异常处理框架, 是Java语言健壮性的一个重要体现. Java把 ...
随机推荐
- SQL基本概念-SQL通用语法
SQL基本概念 1. 什么是SQL ? Structured Query Language : 结构化查询语言,其实就是定义了操作所有关系型数据库的规则.每一种数据库操作的方式存在不一样的地方,称为 ...
- 【Azure Cache for Redis】Python Djange-Redis连接Azure Redis服务遇上(104, 'Connection reset by peer')
问题描述 使用Python连接Azure Redis服务,因为在代码中使用的是Djange-redis组件,所以通过如下的配置连接到Azure Redis服务: CACHES = { "de ...
- 移动 WEB 开发之 阿里百秀移动端页面制作
一.技术选型 二.需求分析 1.页面布局分析 2. 屏幕划分 三.页面制作 1. 项目前期准备 搭建项目结构 创建 html 骨架结构以及引入相关样式 <head> <meta ch ...
- C#,Winform软件防破译-源代码加密简单方法之.NET REACTOR(二)制作软件及软件试用时间限定
二.简单介绍使用 .net reactor 软件制作试用软件,利用license制作授权软件的方法. 1.首先,生成试用版软件 设置主文件和附属文件,打开.net Reactor 设置试用期限,在Se ...
- jwt的一些封装
package study; import java.io.File; import java.io.IOException; import java.nio.file.Files; import j ...
- WSL 2 内配置Fcitx自启动
前言 我通过配置成fcitx进行服务进行,但其权限是root,在普通模式下无法使用 我用的是xserver ( moba xterm),我要在gtk mode 下启动fcitx,其实 不用这么写 操作 ...
- JAVA虚拟机14 类加载器
1.简介 Java虚拟机设计团队有意把类加载阶段中的"通过一个类的全限定名来获取描述该类的二进制字节流"这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需的 ...
- 【Oculus Interaction SDK】(九)使用控制器时显示手的模型
前言 这篇文章是[Oculus Interaction SDK]系列的一部分,如果发现有对不上的对方,可以回去翻看我之前发布的文章,或在评论区留言.如果文章的内容已经不适用于新版本了,也可以直接联系我 ...
- STL中的智能指针(Smart Pointer)及其源码剖析: std::auto_ptr
STL中的智能指针(Smart Pointer)及其源码剖析: std::auto_ptr auto_ptr 是STL中的智能指针家族的成员之一, 它管理由 new expression 获得的对象, ...
- 跳板攻击之:CS代理转发
跳板攻击之:CS代理转发 目录 跳板攻击之:CS代理转发 1 环境准备 1.1 环境拓扑 1.2 前提 2 配置 Socks 代理 3 配置转发监听器(正向连接) 4 配置转发上线(反向连接) 1 环 ...