`

for循环删除(ArrayList.remove)报错及解决办法

阅读更多
[size=small]代码:
JSONArray bindCards = getJSONArray();
			bindCards.forEach(bindCard->{
				JSONObject bindCardJson = (JSONObject)bindCard;
				if (StringUtils.equals(account.getAccNo(), bindCardJson.getString("bindBankCardId"))) {
					bindCards.remove(bindCard);
				}
			});



报错:
java.util.ConcurrentModificationException: null
	at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901) ~[na:1.8.0_112]
	at java.util.ArrayList$Itr.next(ArrayList.java:851) ~[na:1.8.0_112]
	at java.lang.Iterable.forEach(Iterable.java:74) ~[na:1.8.0_112]



原因及解决方法:
原因:
Iterator 是工作在一个独立的线程中,并且拥有一个 mutex 锁。 Iterator 被创建之后会建立一个指向原来对象的单链索引表,当原来的对象数量发生变化时,这个索引表的内容不会同步改变,所以当索引指针往后移动的时候就找不到要迭代的对象,所以按照 fail-fast 原则 Iterator 会马上抛出 java.util.ConcurrentModificationException 异常。

所以 Iterator 在工作的时候是不允许被迭代的对象被改变的。但你可以使用 Iterator 本身的方法 remove() 来删除对象, Iterator.remove() 方法会在删除当前迭代对象的同时维护索引的一致性。[/size]

参考博文:http://blog.csdn.net/u010523770/article/details/51943791
分享到:
评论

相关推荐

    java遍历list集合3种方式和性能对比

    如果在遍历过程中需要删除元素,只能使用`it.remove()`,而不能直接使用`list.remove()`,否则可能会引发并发访问错误。 2. 使用增强型`for`循环(也称为foreach循环): ```java List list = new ArrayList(); // ...

    藏经阁-Java开发手册(泰山版)灵魂13问-117.pdf

    解决办法是在使用前确保所有可能出现的null值已经得到妥善处理。 2. **初始化HashMap的容量大小**: 阿里巴巴建议初始化HashMap时指定容量,以避免内部扩容操作带来的性能开销。合适的初始化容量取决于预期的元素...

    11.集合框架001-Collection接口4-5

    此外,Java 5引入的增强for循环(foreach)简化了遍历过程,如:`for (Type item : collection) { //... }`,这在处理集合时更加简洁易读。 6. **集合与数组的区别**:数组是固定大小的,元素类型必须一致;而集合...

    详解Java 集合类 List 的那些坑

    在直接遍历 List 集合元素时增加、删除元素会报错,例如使用 for 循环遍历 List 时删除元素,会抛出 ConcurrentModificationException 异常。解决方法是使用 Iterator 迭代器遍历 List,并使用 Iterator 的 remove ...

    java集合与泛型[参考].pdf

    例如,如果你声明了一个`ArrayList<String>`,那么这个列表只能添加字符串,否则编译器会报错,避免了运行时可能出现的ClassCastException。 集合框架还包括几个主要的子接口: - **Set**:不允许重复元素,如`...

    2019年最新版修订版Java程序员面试宝典.pdf

    10. **`List`初始化的不同方式**:`Lista = new ArrayList()`和`ArrayList a = new ArrayList()`在实际效果上没有区别,都创建了一个`ArrayList`实例。 11. **对集合更新操作**:在操作集合时,应该避免在遍历的...

    JAVA基础考试题.pdf

    关于`equals()`方法,所有Java对象都继承自`Object`类,`Object`类定义了`equals()`方法,所以编译不会报错,选项D描述了正确的行为。 集合的选择取决于数据需求,如存储键值对使用`HashMap`,有序存储使用`TreeSet...

    60条Android开发注意事项与经验总结

    16. ArrayList操作:arraylist执行remove时注意移除int和Integer的区别。 17. Log打印:Log请打上Tag,调试打印一定要做标记,能定位打印位置,否则尴尬是:不知道是哪里在打印。 18. 代码复用:码块/常量/资源...

    collection集合体系与并发修改异常的解决方法

    "collection集合体系与并发修改异常的解决方法" Collection 集合体系是 Java 语言中的一种数据结构,它提供了多种方式来存储和操作数据。Collection 集合体系包括了多个接口和实现类,今天我们将对 Collection 集合...

    java必备的经典面试题

    - 通过类加载器:`Class<?> clazz = Class.forName("YourClass");` #### 22. 如何唤起类中的一个方法? - 使用`Method`类的`invoke()`方法,需要先通过反射获取`Method`对象。 #### 23. 如何将数值型字符转换为...

    Java语言程序设计基础第十版第十一章课后复习题答案

    如果父类没有无参构造函数,则编译器会报错。在例子a中,因为B类继承自A类,所以在创建C类对象时,会先调用A类的构造函数。而在例子b中,因为A类没有无参构造函数,所以尝试创建B类对象会导致编译错误。 #### 11.5 ...

    java面试总结

    - **java.util**: 提供了一系列用于处理集合的数据结构,如`ArrayList`、`HashMap`等。 - **java.io**: 包含了各种输入输出相关的类,如`FileInputStream`、`OutputStreamWriter`等。 - **java.net**: 提供了网络...

Global site tag (gtag.js) - Google Analytics