合并两个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
相关产品推荐
相关产品推荐

