ConcurrentModificationException - >如何更改我的代码以阻止它抛出此错误?

时间:2017-04-29 10:29:48

标签: java exception

for (FPlayer p : fPlayer.getFaction().getOnline()) {
            p.setFaction(null);   
        }

基本上,getOnline方法返回当前在线FPlayers的数组列表。从派系中移除FPlayer时,派系设置为null(p.setFaction(null))。

我无法考虑如何更改我的代码以阻止它抛出ConcurrentModificationException。我使用了一个迭代器,但仍然,it.next()。setFaction(null)仍然抛出相同的异常。

编辑: 使用列表ITERATOR:

    ListIterator<FPlayer> it = fPlayer.getFaction().getOnline().listIterator();
    while (it.hasNext()) {
        it.next().setFaction(null);
    }
  

引起:java.util.ConcurrentModificationException

  

it.next()。setFaction(空)

编辑#2:编辑#2: 设置派系方法:

public void setFaction(Faction faction) {
    if (hasFaction()) {
        this.faction.getOnline().remove(this);
    }

    this.faction = faction;
    if (faction != null) {
        this.faction.getOnline().add(this);
    }
}

2 个答案:

答案 0 :(得分:1)

是的,更改您的代码,以便它不会更改您正在运行的循环内的集合。例如,在迭代之前创建集合的副本。

for (Foo foo : new ArrayList(myFoos)) {
   if (foo.isBar()) {
       myFoos.remove(foo);
   }
}

在没有new ArrayList()的情况下迭代和更改列表会导致ConcurrentModificationException

答案 1 :(得分:1)

这种情况正在发生,因为在迭代时您将从列表中删除数据。

一些解决方案。

  1. 如果列表大小很小,请将其转换为数组,然后循环

  2. 使用for循环进行迭代。

     for(int i=0;i<fPlayer.getFaction().getOnline().size();i++)
      {
        // Condition to check if true 
           if(true)
              {
               fPlayer.getFaction().getOnline().remove(i);
                i--;
                  }
      }