|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Apr 2010
Città: Asti - Torino
Messaggi: 336
|
[JAVA] Problemi con ArrayList
Ciao a tutti, devo correggere un programma in Java ma non ho ben capito l'errore che mi da nel main d'esempio:
Exception in thread "main" java.util.ConcurrentModificationException at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:782) at java.util.ArrayList$Itr.next(ArrayList.java:754) at jbook.Account.accetto(Account.java:46) at Esempio.main(Esempio.java:35) L'errore viene segnalato in questa porzione di codice: Collection<Utente> richieste = jane.richieste();E ovviamente il codice del metodo accetto(): public void accetto(Utente nuovoAmico) throws RichiestaInesistenteException {Cosa posso fare? Grazie mille!
__________________
Notebook: HP dv6-3117 sl -->CPU: Intel Core i7-720QM (1.60GHz, 6 MB L3); SCHEDA VIDEO: ATI Mobility Radeon HD 5650 1GB; HD: 1TB 7200rpm; RAM: 8GB DDR3
Smarthphone: Samsung Galaxy S2 I9100 - Apple iPhone 4S |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jun 2007
Città: Milano
Messaggi: 413
|
Il problema è dovuto al fatto che vai a modificare la tua collection mentre la stai ciclando. Per risolvere dovresti utilizzare gli Iterator.
Esempio che crasha: Codice:
for(String message : messages) {
if (condition(message))
messages.remove(message);
}
Codice:
for(Iterator<String> iter = messages.iterator(); iter.hasNext();) {
String message = iter.next();
if (condition(message))
iter.remove();
}
|
|
|
|
|
|
#3 | ||
|
Senior Member
Iscritto dal: Apr 2010
Città: Asti - Torino
Messaggi: 336
|
Modificato in:
Quote:
Quote:
__________________
Notebook: HP dv6-3117 sl -->CPU: Intel Core i7-720QM (1.60GHz, 6 MB L3); SCHEDA VIDEO: ATI Mobility Radeon HD 5650 1GB; HD: 1TB 7200rpm; RAM: 8GB DDR3
Smarthphone: Samsung Galaxy S2 I9100 - Apple iPhone 4S |
||
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Oct 2004
Messaggi: 1945
|
Non puoi usare un semplice iteratore per modificare gli elementi in una Collection... devi usare ListIterator e comunque non puoi modificare una lista direttamente dalla sua istanza, ma solo con il ListIterator
es questo non va bene Codice:
ArrayList<Integer> al = new .....
ListIterator<Integer> li = al.listIterator();
while(li.hasNext()){
Integer in = li.next();
if(in.equals(5))
al.add(qualcosa);
}
Codice:
ArrayList<Integer> al = new .....
ListIterator<Integer> li = al.listIterator();
while(li.hasNext()){
Integer in = li.next();
if(in.equals(5))
li.add(qualcosa);
}
|
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Apr 2010
Città: Asti - Torino
Messaggi: 336
|
Quote:
Codice:
for(ListIterator<Utente> iter = mio_utente.richieste().listIterator(); iter.hasNext();)
__________________
Notebook: HP dv6-3117 sl -->CPU: Intel Core i7-720QM (1.60GHz, 6 MB L3); SCHEDA VIDEO: ATI Mobility Radeon HD 5650 1GB; HD: 1TB 7200rpm; RAM: 8GB DDR3
Smarthphone: Samsung Galaxy S2 I9100 - Apple iPhone 4S |
|
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Jun 2007
Città: Milano
Messaggi: 413
|
Quote:
Codice:
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>() {
{
add("1");
add("2");
add("3");
}
};
for (Iterator<String> iter = list.iterator(); iter.hasNext();) {
String string = iter.next();
if (string.equals("3"))
iter.remove();
}
for(String s: list){
System.out.println(s);
}
}
Se non chiami iterator.remove() è normale che ti da ancora (lo stesso) errore. |
|
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Apr 2010
Città: Asti - Torino
Messaggi: 336
|
Quote:
Inviato dal mio GT-I9100 usando Tapatalk
__________________
Notebook: HP dv6-3117 sl -->CPU: Intel Core i7-720QM (1.60GHz, 6 MB L3); SCHEDA VIDEO: ATI Mobility Radeon HD 5650 1GB; HD: 1TB 7200rpm; RAM: 8GB DDR3
Smarthphone: Samsung Galaxy S2 I9100 - Apple iPhone 4S |
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Jun 2007
Città: Milano
Messaggi: 413
|
Ok, allora rifattorizziamo un attimo scomponendo il codice. Prima cerchi e poi rimuovi:
Codice:
public void accetto(Utente nuovoAmico) throws RichiestaInesistenteException {
int index;
index = search(nuovoAmico);
if(index != -1){
mio_utente.addAmico(nuovoAmico);
mio_utente.delRichiesta(mio_utente.get(index));
}
else
throw new RichiestaInesistenteException();
}
private int search(Utente nuovoAmico){
int i=0;
for(Utente u : mio_utente.richieste() ){
if(u.getNome().equals(nuovoAmico.getNome())) {
return i;
}
i++;
}
return -1;
}
|
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Apr 2010
Città: Asti - Torino
Messaggi: 336
|
Quote:
__________________
Notebook: HP dv6-3117 sl -->CPU: Intel Core i7-720QM (1.60GHz, 6 MB L3); SCHEDA VIDEO: ATI Mobility Radeon HD 5650 1GB; HD: 1TB 7200rpm; RAM: 8GB DDR3
Smarthphone: Samsung Galaxy S2 I9100 - Apple iPhone 4S |
|
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Oct 2004
Messaggi: 1945
|
|
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Apr 2010
Città: Asti - Torino
Messaggi: 336
|
Quote:
Codice:
Exception in thread "main" java.util.ConcurrentModificationException at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:782) at java.util.ArrayList$Itr.next(ArrayList.java:754) at Esempio.main(Esempio.java:34)
__________________
Notebook: HP dv6-3117 sl -->CPU: Intel Core i7-720QM (1.60GHz, 6 MB L3); SCHEDA VIDEO: ATI Mobility Radeon HD 5650 1GB; HD: 1TB 7200rpm; RAM: 8GB DDR3
Smarthphone: Samsung Galaxy S2 I9100 - Apple iPhone 4S |
|
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Oct 2004
Messaggi: 1945
|
Quote:
Ma sei proprio sicuro che quell'eccezione si riferisca a quella porzione di codice?? |
|
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: Apr 2010
Città: Asti - Torino
Messaggi: 336
|
Quote:
Codice:
for(Utente richiedente : richieste){ // accetta tutte le richieste
jane.accetto(richiedente);
__________________
Notebook: HP dv6-3117 sl -->CPU: Intel Core i7-720QM (1.60GHz, 6 MB L3); SCHEDA VIDEO: ATI Mobility Radeon HD 5650 1GB; HD: 1TB 7200rpm; RAM: 8GB DDR3
Smarthphone: Samsung Galaxy S2 I9100 - Apple iPhone 4S |
|
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Oct 2004
Messaggi: 1945
|
Precisiamo una cosa.. Eclipse non c'entra nulla con le eccezioni
Quell'eccezione è scatenata da un'operazione di modifica di una struttura dati che viene scandita da un iteratore. Quindi morale della favola devi usare un ListIterator. Comunque dato che stai utilizzando un ArrayList perchè non operarci direttamente senza iteratore?? Praticamente la usi come un semplice array, solo che in questo caso è dinamico. Hai necessità di prestazioni elevate? Cioè la tua ArrayList è molto grande? |
|
|
|
|
|
#15 | |
|
Senior Member
Iscritto dal: Apr 2010
Città: Asti - Torino
Messaggi: 336
|
Quote:
Inviato dal mio GT-I9100 usando Tapatalk
__________________
Notebook: HP dv6-3117 sl -->CPU: Intel Core i7-720QM (1.60GHz, 6 MB L3); SCHEDA VIDEO: ATI Mobility Radeon HD 5650 1GB; HD: 1TB 7200rpm; RAM: 8GB DDR3
Smarthphone: Samsung Galaxy S2 I9100 - Apple iPhone 4S |
|
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: Oct 2004
Messaggi: 1945
|
Tutte le porzioni di codice che hai postato tu però usavano un iteratore. Io e CwNd ti abbiamo mostrato come usare un ListIterator
Modifica con ListIterator e facci sapere |
|
|
|
|
|
#17 | |
|
Senior Member
Iscritto dal: Apr 2010
Città: Asti - Torino
Messaggi: 336
|
Quote:
Inviato dal mio GT-I9100 usando Tapatalk
__________________
Notebook: HP dv6-3117 sl -->CPU: Intel Core i7-720QM (1.60GHz, 6 MB L3); SCHEDA VIDEO: ATI Mobility Radeon HD 5650 1GB; HD: 1TB 7200rpm; RAM: 8GB DDR3
Smarthphone: Samsung Galaxy S2 I9100 - Apple iPhone 4S |
|
|
|
|
|
|
#18 |
|
Senior Member
Iscritto dal: Apr 2010
Città: Asti - Torino
Messaggi: 336
|
Modificando solo il metodo search() così:
Codice:
public int search (Utente utente) {
int i = 0;
Iterator<Utente> li = mio_utente.richieste().iterator();
while(li.hasNext()){
Utente u = li.next();
if(u.getNome().equals(utente.getNome()))
return i;
i++;
}
return -1;
}
Codice:
Exception in thread "main" java.util.ConcurrentModificationException at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:782) at java.util.ArrayList$Itr.next(ArrayList.java:754) at Esempio.main(Esempio.java:34) Codice:
ListIterator<Utente> li = mio_utente.richieste().listIterator();
__________________
Notebook: HP dv6-3117 sl -->CPU: Intel Core i7-720QM (1.60GHz, 6 MB L3); SCHEDA VIDEO: ATI Mobility Radeon HD 5650 1GB; HD: 1TB 7200rpm; RAM: 8GB DDR3
Smarthphone: Samsung Galaxy S2 I9100 - Apple iPhone 4S |
|
|
|
|
|
#19 |
|
Senior Member
Iscritto dal: Oct 2006
Città: milano
Messaggi: 1439
|
Ma richieste() che tipo restituisce?? listIterator() lo devi invocare su una classe che implementa List o che eredita da AbstractList.
|
|
|
|
|
|
#20 | |
|
Senior Member
Iscritto dal: Apr 2010
Città: Asti - Torino
Messaggi: 336
|
Quote:
Inviato dal mio GT-I9100 usando Tapatalk
__________________
Notebook: HP dv6-3117 sl -->CPU: Intel Core i7-720QM (1.60GHz, 6 MB L3); SCHEDA VIDEO: ATI Mobility Radeon HD 5650 1GB; HD: 1TB 7200rpm; RAM: 8GB DDR3
Smarthphone: Samsung Galaxy S2 I9100 - Apple iPhone 4S |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 07:45.




















