You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

合并两个MusicBand成员时触发ConcurrentModificationException异常求助(新手)

问题分析与解决

异常原因

你遇到的ConcurrentModificationException是因为在增强for循环遍历集合的过程中,直接修改了原集合。增强for循环底层依赖集合的迭代器,迭代器在遍历过程中会维护一个修改计数器,一旦集合被迭代器之外的方式修改(比如直接调用clear()),计数器不匹配就会抛出这个异常。你的代码里,第一次循环就调用了a.getMembers().clear(),此时迭代器还没完成遍历,直接触发了异常。

修复方案

根本不需要逐个遍历添加,List提供了addAll()方法可以一次性将一个集合的所有元素添加到另一个集合,之后再清空原集合即可,这样既简洁又避免了遍历中修改集合的问题。

修改后的transferMembers静态方法如下:

public static void transferMembers(MusicBand a, MusicBand b) {
    // 将a的所有成员添加到b的成员列表中
    b.getMembers().addAll(a.getMembers());
    // 清空a的成员列表
    a.getMembers().clear();
}

验证效果

修改后运行测试类,控制台会输出:

[a, b, c]
[a2, b2, c2]

调用transferMembers后,group2的成员会变为[a2, b2, c2, a, b, c],group1的成员列表变为空,且不会抛出任何异常。

额外优化建议

为了避免外部代码直接修改内部的成员集合(比如调用getMembers()后直接对集合进行增删改),可以在getMembers()方法中返回集合的不可修改视图,提高封装性:

import java.util.Collections;

// ...
public List<String> getMembers() {
    return Collections.unmodifiableList(members);
}

如果需要修改内部集合,只能通过类提供的方法(比如新增addMember、removeMember等)来操作,这样能更好地控制集合的修改逻辑,避免意外的并发修改问题。

内容的提问来源于stack exchange,提问作者Le Ga

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 19:45:35