Normális esetben kompatibilis. Ha valóban CME-t dob, akkor a jelek szerint az Army objektumaid nyilvántartják magukban, hogy a defenderArmies collection részei, és valamelyik remove (gondolom az utóbbi) el akarja távolítani saját magát a defenderArmies collection-ből is.
És ha ez a helyzet, míg az iteratoros példa CME nélkül lefut, akkor szerintem hibázik. Mivel az iterator saját állapotot tart fenn, hogy tájékozódjon a collectionben, őt különösebben nem zavarja, ha menet közben törölsz a listából, de ha ezt nem közlöd az iteratorral, akkor minimum hibás eredményt hoz, pl. nem töröl mindent, vagy nem azt törli, amit kellene, nem tudom.
Az iterator tényleg lefut, míg a foreach elszáll?
A helyes iterator használat valahogy így nézne ki:
Iterator<Army> iter = defenderArmies.iterator();
while (iter.hasNext()) {
Army army = iter.next();
// do sth with army
iter.remove();
}
Az iter.remove() mondja meg az iteratornak, hogy itt törlés van, és vissza kell léptetnie a kurzorát. Enélkül, hát, csodálom, hogy nem dob hibát.