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
在
行编辑#2:编辑#2: 设置派系方法:it.next()。setFaction(空)
public void setFaction(Faction faction) {
if (hasFaction()) {
this.faction.getOnline().remove(this);
}
this.faction = faction;
if (faction != null) {
this.faction.getOnline().add(this);
}
}
答案 0 :(得分:1)
是的,更改您的代码,以便它不会更改您正在运行的循环内的集合。例如,在迭代之前创建集合的副本。
for (Foo foo : new ArrayList(myFoos)) {
if (foo.isBar()) {
myFoos.remove(foo);
}
}
在没有new ArrayList()
的情况下迭代和更改列表会导致ConcurrentModificationException
答案 1 :(得分:1)
这种情况正在发生,因为在迭代时您将从列表中删除数据。
一些解决方案。
如果列表大小很小,请将其转换为数组,然后循环
使用for循环进行迭代。
for(int i=0;i<fPlayer.getFaction().getOnline().size();i++)
{
// Condition to check if true
if(true)
{
fPlayer.getFaction().getOnline().remove(i);
i--;
}
}