Originariamente inviato da bobby_fire
salve ragazzi ho questo esercizio da fare ho un lista per ogni elemento lo devo valutare e rimetterlo in coda alla lista
Esempio:

Quote:
for(Object obj:listEntityName)
{
runValutate(obj);
listEntityName.add(obj);
}
però cosi mi da un'eccezzione come posso fare?
Sì, la eccezione è ConcurrentModificationException e succede perché la maggior parte delle collezioni standard in java.util ha un iteratore che ha un comportamento detto "fail-fast". L'iteratore verifica se la collezione è stata modificata strutturalmente in qualunque modo (eccetto tramite il remove() dell'iteratore stesso o anche il add() se fosse un ListIterator) e in tal caso lancia ConcurrentModificationException.
E il "for-each" usato nel tuo codice fa usare sotto-sotto di nascosto l'iteratore.

Soluzioni? Sì, ci sono:

1) Inserire gli elementi in una nuova collezione a parte, quindi dopo che la iterazione è terminata aggiungi tutti gli elementi con addAll(). Questa funziona senza problemi.

2) Non usi (esplicitamente o implicitamente che sia) un iteratore ma usi il classico ciclo for con l'indice. Questo funziona ma devi stare attento ... stai aggiungengo sulla stessa lista su cui scansioni, quindi nel test indice<lunghezza del for, dovresti tenerti un lunghezza con il valore iniziale della lista, altrimenti se usassi indice<list.size() potenzialmente andresti avanti pure sugli elementi aggiunti.

3) Usi esplicitamente un ListIterator che ha il add() che funziona correttamente (è la eccezione detta sopra). Anche qui c'è da stare attenti come al punto 2).