在Java

时间:2016-01-16 13:08:18

标签: java concurrentmodification

在我的计划中,我创建了团队(例如足球),现在我想创建一种方法,让每支球队都与其他球队进行比赛。我的方法抛出ConcurrentModificationException。这是:

public void playMatches(){
    for (Team team : mTeams) {
        mTeams.remove(team);
        for (Team team1 : mTeams) {
            match(team, team1);
        }
        mTeams.add(team);
    }
}

我正在从mTeams中移除团队本身,因此它不会对抗自身,但这会抛出异常。我该怎么处理?

3 个答案:

答案 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。使用迭代器删除或添加