关于foreach中集合添加元素报错ConcurrentModificationException
秋水 Lv5

错误代码示例

1
2
3
4
5
6
7
8
9
List<SubjectLabelBO> boList = new LinkedList<>();
boList.forEach(label -> {
SubjectLabelBO bo = new SubjectLabelBO();
bo.setId(label.getId());
bo.setLabelName(label.getLabelName());
bo.setCategoryId(label.getCategoryId());
boList.add(bo);
});

在java中,循环中尝试向这个同一集合 boList 添加新的元素。由于 for-each 循环使用迭代器进行元素访问,当在循环中尝试修改这个集合时(如添加或删除元素),就会触发 ConcurrentModificationException

原因

for-each 循环开始时,它会为集合创建一个迭代器。这个迭代器有一个预期的修改计数,它与集合的修改计数同步。每当集合被修改(添加、删除元素等),其修改计数会增加。迭代器在每次迭代时都会检查这个计数,如果发现计数不符(即集合在迭代中被修改了),它就会抛出 ConcurrentModificationException。这是迭代器的快速失败行为,目的是防止不确定的行为和潜在的错误。

解决办法

  1. 使用传统for循环
  2. 使用java8的stream API
  3. 使用ListIterator
  • Post title:关于foreach中集合添加元素报错ConcurrentModificationException
  • Post author:秋水
  • Create time:2024-05-13 19:39:11
  • Post link:tai769.github.io2024/05/13/关于foreach中集合添加元素报错/
  • Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.