Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2007
    Messaggi
    42

    Strana eccezione col metodo remove della classe ArrayList

    Ciao a tutti!
    Non riesco a capire il perchè di questa eccezione,dato che eclipse non mi dice nulla di sbagliato.Ma in fase di compilazione ricevo errori:
    codice:
    //Metodo che cancella un elemento(vincolo:l'elemento deve esistere nella lista)
    	public void cancella(String nome){
    		boolean presente = false;
    		for (Persona contatto : contatti){
    			if(nome.equals(contatto.getNome())){
    				System.out.println("Il nome " + nome + " verrà cancellato");
    				contatti.remove(contatto); 
    				presente = true;
    			}
    		}
    		if (presente == false){
    			System.out.println("Il contatto "+ nome +" non verrà cancellato perchè non è presente nella lista");
    		}
    	}
    L'errore sta proprio là.Ho provato a mettere contatti.remove(0),ma mi da sempre lo stesso errore.
    Qui posto ciò che mi da eclipse in fase di compilazione:
    Exception in thread "main" java.util.ConcurrentModificationException
    at java.util.AbstractList$Itr.checkForComodification( AbstractList.java:372)
    at java.util.AbstractList$Itr.next(AbstractList.java: 343)
    at Rubrica.cancella(Rubrica.java:32)
    at Rubricatest.main(Rubricatest.java:9)
    La stranezza vuole,che se metto un nome inesistente,non vengono lanciate eccezioni,ed è questa la cosa davvero strana!

    Dove sbaglio?
    Grazie in anticipo!

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Strana eccezione col metodo remove della classe ArrayList

    Originariamente inviato da onepiece007
    Non riesco a capire il perchè di questa eccezione
    Il problema nasce dal fatto che stai facendo una "iterazione" sulla collezione. Indipendentemente da un uso "concorrente" o meno di una collezione, cosa potrebbe o dovrebbe succedere se una collezione viene modificata mentre si sta iterando sulla collezione?

    Nelle principali collezioni, quelle base intendo, non quelle nuove di Java 5/6 specifiche per uso concorrente, è stata fatta una scelta e cioè gli iteratori sono stati realizzati per comportarsi in un modo che viene chiamato "fail-fast". hasNext/next dell'iteratore lanciano ConcurrentModificationException se trovano che la collezione è stata modificata con un qualunque metodo che, attenzione, non è il remove() dell'iteratore.
    Questo controllo è fatto in modo "best-effort", in realtà il comportamento fail-fast non può essere garantito al 100% per questioni di sincronizzazione che ora non sto a spiegare.

    Mentre si sta iterando, l'unica operazione di modifica che si può fare è eliminare un elemento usando il remove() dell'iteratore. Se si usa il for-each di Java 5, l'iteratore c'è e viene usato ma in realtà è "nascosto". Pertanto, se si vuole usare il remove() dell'iteratore si deve usare un apposito Iterator e non usare il for-each.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2007
    Messaggi
    42
    Quindi dovrei usare la funzione iterator a quanto pare.
    Però nel mio corso non ho avuto a che fare con questa funziona,quindi l'uso in teoria dovrebbe essere vietato.
    Ci potrebbero essere altri escamotage oppure è l'unica soluzione?

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da onepiece007
    Ci potrebbero essere altri escamotage oppure è l'unica soluzione?
    Visto che usi un ArrayList, l'unica sarebbe scansionare la lista tramite indice con un for "classico".

    Se si usa un Iterator esplicitamente o implicitamente (tramite for-each) c'è il problema che ho descritto prima. Dal momento in cui viene creato l'oggetto Iterator fino alla fine della iterazione l'unica modifica possibile è tramite il remove() dell'Iterator.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2007
    Messaggi
    42
    Originariamente inviato da andbin
    Visto che usi un ArrayList, l'unica sarebbe scansionare la lista tramite indice con un for "classico".

    Se si usa un Iterator esplicitamente o implicitamente (tramite for-each) c'è il problema che ho descritto prima. Dal momento in cui viene creato l'oggetto Iterator fino alla fine della iterazione l'unica modifica possibile è tramite il remove() dell'Iterator.
    Purtroppo anche qui ci sta un problema:
    codice:
    //Metodo che cancella un elemento(vincolo:l'elemento deve esistere nella lista)
    	public void cancella(String nome){
    		boolean presente = false;
    		for (int i = 0;i < contatti.size()-1;i++){
    			if(nome.equals(contatto.getNome())){
    				System.out.println("Il nome " + nome + " verrà cancellato");
    				presente = true;
    			}
    		}
    		if (presente == false){
    			System.out.println("Il contatto "+ nome +" non verrà cancellato perchè non è presente nella lista");
    		}
    
    	}
    Ora contatto non può essere risolto!
    Eppure la scansione viene fatta con un ciclo for normale.

  6. #6
    Utente di HTML.it
    Registrato dal
    Dec 2007
    Messaggi
    42
    Ok penso di aver risolto!
    Posto il codice:
    codice:
    //Metodo che cancella un elemento(vincolo:l'elemento deve esistere nella lista)
    	public void cancella(String nome){
    		boolean presente = false;
    		for (int i = 0;i < contatti.size();i++){
    			Persona scan = contatti.get(i);
    			if(nome.equals(scan.getNome())){
    				System.out.println("Il nome " + nome + " verrà cancellato");
    				presente = true;
    				contatti.remove(i);
    			}
    		}
    		if (presente == false){
    			System.out.println("Il contatto "+ nome +" non verrà cancellato perchè non è presente nella lista");
    		}
    
    	}
    Grazie di nuovo andbin

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da onepiece007
    Ok penso di aver risolto!
    Non proprio ... se rimuovi un elemento non dovresti incrementare l'indice. Se rimuovi un elemento all'indice 3, il prossimo elemento è ... all'indice 3.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    Utente di HTML.it
    Registrato dal
    Dec 2007
    Messaggi
    42
    Originariamente inviato da andbin
    Non proprio ... se rimuovi un elemento non dovresti incrementare l'indice. Se rimuovi un elemento all'indice 3, il prossimo elemento è ... all'indice 3.
    Stranissimo dato che quel codice l'ho testato più volte è funziona.
    Ho provato tutte le combinazioni possibili ed è sempre andato a buon fine!
    Non capisco qual è l'errore...?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.