for (FPlayer p : fPlayer.getFaction().getOnline()) { p.setFaction(null); }Básicamente, el método getOnline devuelve una lista de matriz de los FPlayers actuales que están en línea. Cuando el FPlayer se elimina de su facción, la facción se establece en nulo (p.setFaction(null)).
No puedo pensar en cómo cambiar mi código para evitar que lance la ConcurrentModificationException. He usado un iterador pero aún así, it.next().setFaction(null) todavía arroja la misma excepción.
EDITAR: UTILIZAR UN ITERADOR DE LISTA:
ListIterator<FPlayer> it = fPlayer.getFaction().getOnline().listIterator(); while (it.hasNext()) { it.next().setFaction(null); }Causado por: java.util.ConcurrentModificationException
en la linea
it.next().setFaction(null)
EDIT #2: Establecer método de facción:
public void setFaction(Faction faction) { if (hasFaction()) { this.faction.getOnline().remove(this); } this.faction = faction; if (faction != null) { this.faction.getOnline().add(this); } }Sí, cambie su código para que no cambie la colección dentro del ciclo que está ejecutando. Por ejemplo, cree una copia de la colección antes de iterar.
for (Foo foo : new ArrayList(myFoos)) { if (foo.isBar()) { myFoos.remove(foo); } } Iterar y cambiar la lista sin el new ArrayList() habría causado una ConcurrentModificationException
Esto sucede porque mientras itera está eliminando los datos de la lista.
Un par de soluciones.
Si el tamaño de la lista es pequeño, conviértalo en una matriz y luego recorra
Use for loop para la iteración.
for(int i=0;i<fPlayer.getFaction().getOnline().size();i++) { // Condition to check if true if(true) { fPlayer.getFaction().getOnline().remove(i); i--; } }