ConcurrentModificationException

di il
6 risposte

ConcurrentModificationException

Salve a tutti,

in una classe che sto realizzando ho il seguente metodo:

/**
     * Permette di eliminare un viaggio predefinito dalla lista di viaggi che 
     * l'agenzia mette a disposizione dei clienti.
     * @param v Il codice del viaggio da eliminare.
     */
    public void removeViaggio(String cv) throws ConcurrentModificationException
    {
        for(Viaggio v: viaggiPredefiniti)
        {
            if(v.getCodiceId().equals(cv))
            {
                viaggiPredefiniti.remove(v);
            }
        
        }   
    }
il metodo funziona fino a quando ho più di un oggetto di tipo Viaggio nell'ArrayList.
Nel caso in cui l'arrayList contenga un solo oggetto di tipo Viaggio, mi appare il seguente errore:
Exception in thread "main" java.util.ConcurrentModificationException
	at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:819)
	at java.util.ArrayList$Itr.next(ArrayList.java:791)
	at agenziadiviaggi.Agenzia.removeViaggio(Agenzia.java:324)
	at agenziadiviaggi.AgenziaDiViaggi.main(AgenziaDiViaggi.java:236)
Sapete cosa significa?? Come posso risolvere il problema??

Grazie!

6 Risposte

  • Re: ConcurrentModificationException

    È un problema che ebbi anche io...se non mi sbaglio al gestione della concorrenza è che mette qualche cosa in situazioni strane...se non mi sbaglio io ho risolto creando una nuova lista e facendo il removeAll di questa nuova lista...
  • Re: ConcurrentModificationException

    Buongiorno, grazie per avermi risposto!

    Se modificassi il metodo in questo modo:
    public void removeViaggio(String cv)
        {
            for(Viaggio v: viaggiPredefiniti)
            {
                    if(v.getCodiceId().equals(cv))
                    {
                        if(viaggiPredefiniti.size()==1)
                        {
                            viaggiPredefiniti = new ArrayList<>();
                        }
                        else
                        {
                            viaggiPredefiniti.remove(v);
                        }
                
                        
                    }
                }
        }
    risolverei il problema?
  • Re: ConcurrentModificationException

    Probabile, ma fai prima a provare che aspettare risposte
  • Re: ConcurrentModificationException

    Il problema sembra risolto
    Grazie per l'aiuto!
  • Re: ConcurrentModificationException

    clari ha scritto:


    Il problema sembra risolto
    Grazie per l'aiuto!
    figurati, ma se hai tempo e mi spieghi il perchè sarebbe gradito
  • Re: ConcurrentModificationException

    Salve,

    provando meglio, il problema era risolto solo per ArrayList che conteneva un solo elemento. Il problema si ripresentava nel caso in cui l'ArrayList conteneva più elementi poiché non è possibile rimuovere dalla lista, se si sta navigando con un ciclo for esteso... Alla fine ho risolto usando l'Iterator in questo modo:
    public void removeViaggio(String c) 
        {
            Iterator<Viaggio> it = viaggiPredefiniti.iterator();
            while(it.hasNext()) 
            {
                Viaggio v = it.next();
                if(v.getCodiceFiscale().equals(c))
                {
                    it.remove();
                }
            }  
        }
Devi accedere o registrarti per scrivere nel forum
6 risposte