迭代器使用过程中为什么抛出ConcurrentModificationException
出现的场景:在迭代器对集合进行遍历的同时,集合本身进行变更操作(add(), remove(), set())。
当正常调用时:
import java.util.ArrayList;
import java.util.Iterator; public class TestDemo {
public static void main(String[] args) {
ArrayList<Integer> a = new ArrayList<>();
a.add(1);
a.add(3);
a.add(5);
a.add(6);
Iterator<Integer> iterator = a.iterator();
while (iterator.hasNext()){
System.out.print(iterator.next()+" ");
}
}
}
结果:
当调用interator()接口里面的remove()操作时:
结果:
当调用ArrayList的对象下的remove()或者add();
或者
便会报错:
那么为何会出现这种情况呢?
首先我们应该知道,ArrayList底层的modCount这个属性,这也是个版本记录号每对ArrayList进行一次增删改操作,都会进行modCount++操作。并且在迭代器的使用中,会将当前的modCount的值赋给expectedModCount迭代器的这个属性。
我们先来看看得ArrayList内地迭代器的部分源码:
可以看到每次Iterator的对象调用next()操作时,都会调用checkForComodification()的方法,具体我们来看看这个方法。
再来看看迭代器中的remove()方法:
可以看到迭代器中的remove()方法虽然也是用的ArrayList的remove()方法,正如前面所说,那也会对modCount的值进行改变,但是关键就在于expectedModCount = modCount,它会将改变的值重新赋给expectedModCount。然后每次用完迭代器中的remove()方法后,就算再次用nex()的方法,调用checkForComodification()方法,就不会抛出异常。但是如果直接用ArrayList的对象调用增删改的方法,modCount值得改变,不会引起expectedModCount值的变化,再次调用迭代器,调用到checkForComodification()方法时,便会抛出ConcurrentModificationException的错误。
总的来说,在调用迭代器的时候,就用迭代器的remove()方法,否则就会出现错误,还有迭代器的一个对象只能进行一次迭代,要多次迭代,,便要创建多个对象。
迭代器使用过程中为什么抛出ConcurrentModificationException的更多相关文章
- lambda表达式中无法抛出受检异常!
抛出受检异常的时候,我们的接口应该带上throw关键字,但通过lambda表达式实现的Consumer的accept方法并不带有关键字,因此在lambda表达式中不能抛出受检异常必须把它吃掉
- 0xe7f001f0!?NDK调试过程,无故抛出SIGSEGV。
arm调试过程,如果抛一个SIGSEGV,地址在 0xe7f001f0 附近,原因居然是因为我在调试.当我使用n指令跳到下一行代码时,往往变成了continue指令一样地执行.还不确定地抛出SIGSE ...
- JAVA 语言如何进行异常处理,关键字: throws,throw,try,catch,finally分别代表什么意义? 在try块中可以抛 出异常吗?
Java通过面向对象的方法进行异常处理,把各种不同的异常进行分类, 并提供了良好的接口. 在 Java中,每个异常都是一个对象,它是 Throwable 类或其它子类的实例.当一个方法出 ...
- Swift 中异常抛出和四种异常处理
在Swift中你可以像其他语言一样抛出异常处理异常,今天我们就详细地说说Swift中的异常抛出和处理. 在一开始我们要定义错误或者说是异常,Swift中的一些简单异常可以使用枚举定义,注意这个枚举要继 ...
- C# 中异常抛出捕获机制--throw / try,catch,finally
try { messagebox.show("true"); } catch { messagebox.show("false"); } finally { m ...
- java异常处理 throw RuntimeException时不需要同时方法中声明抛出throws 异常等待调用者catch进行捕获 子父类异常问题
package com.swift.exception1; public class Demo_Exception { public static void main(String[] args) { ...
- ArrayList迭代修改抛出ConcurrentModificationException
extends:http://www.cnblogs.com/dolphin0520/p/3933551.html Iterator<Integer> iterator = list.it ...
- ArrayList中的modCount与ConcurrentModificationException
在看ArrayList源码时,看到了一个字段modCount.在add.remove.clear等方法中都有modCount++的操作.不明白什么意思.点进去看了看该字段的解释,总算明白了.modCo ...
- SilverLight抛出 System.InvalidOperationException: 超出了2083 的最大URI
在SilverLight中对于抛出 System.InvalidOperationException: 超出了 2083 的最大 URI 长度 的异常 处理 其实很简单 在 EntityFramewo ...
随机推荐
- sorted排序算法
- POJ 2763"Housewife Wind"(DFS序+树状数组+LCA)
传送门 •题意 一对夫妇居住在 xx村庄,给村庄有 $n$ 个小屋: 这 $n$ 个小屋之间有双向可达的道路,不会出现环,即所构成的图是个树: 从 $a_i$ 小屋到 $b_i$ 小屋需要花费 $w_ ...
- Python--day40--datetime,socketserver,Threading模块分别是哪些模块的高层模块
- H3C 多路径网络中环路产生过程(3)
- H3C 用802.1Q和子接口实现VLAN间路由
- H3C DHCP服务器基本配置示例
- P1034 台阶问题一
题目描述 有 \(N\) 级的台阶,你一开始在底部,每次可以向上迈最多2级台阶(最少1级),问到达第 \(N\) 级台阶有多少种不同方式. 输入格式 一个正整数 \(N(\le 20)\) . 输出格 ...
- H3C STP监控与维护
- jquery超级简单的后台系统自适应框架
系统后台自适应简单框架 <!DOCTYPE HTML> <html lang="zh-CN"> <head> <meta http-equ ...
- 2018-2-13-win10-uwp-绑定静态属性
title author date CreateTime categories win10 uwp 绑定静态属性 lindexi 2018-2-13 17:23:3 +0800 2018-2-13 1 ...