在我的计划中,我创建了团队(例如足球),现在我想创建一种方法,让每支球队都与其他球队进行比赛。我的方法抛出ConcurrentModificationException。这是:
public void playMatches(){
for (Team team : mTeams) {
mTeams.remove(team);
for (Team team1 : mTeams) {
match(team, team1);
}
mTeams.add(team);
}
}
我正在从mTeams中移除团队本身,因此它不会对抗自身,但这会抛出异常。我该怎么处理?
答案 0 :(得分:3)
既然你似乎明白了什么在破坏,那么让我们考虑你的问题的“如何处理”部分。好消息是你根本不需要修改你的收藏。
不是通过删除然后添加项来修改集合,而是在内循环中调用match
时从外循环跳过团队,如下所示:
for (Team team : mTeams) {
for (Team team1 : mTeams) {
if (team.equals(team1)) continue;
match(team, team1);
}
}
答案 1 :(得分:0)
当您尝试在迭代它时修改ConcurrentModificationException
并且不使用删除迭代器的方法时,会抛出Collection
。
使用语法
时for (Team team : mTeams) {
为您创建一个迭代器。
如果您想从代码中删除项目,则显式需要迭代迭代器,或者需要使用旧样式for循环进行循环。 例如
for (int i = 0; i < mTeams.size(); i++) {
// Here you can use add and remove on the list without problems
}
或(但这里没用,因为你还需要添加元素,不仅要删除它们)
Iterator<Team> iterator = mTeams.iterator();
while (iterator.hasNext()) {
Team team = iterator.next());
// Here you can use iterator.remove but you can't add
}
答案 2 :(得分:0)
迭代时,您无法对列表中的结构(添加/删除)进行更改。它将抛出ConcurrentModificationException
。使用迭代器删除或添加