Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802

    ConcurrentModificationException... non ne vengo fuori!

    Allora, ho questo metodo che si occupa di togliere da un ArrayList di Download i download completati o cancellati. Il problema è che mi lancia una ConcurrentModificationException (dove ho messo la freccia) e non capisco perche'! Ogni Download e' un Runnable ed il download avviene quindi in parallelo.

    Codice PHP:
       public void removeCompletedOrCancelledDownloads()
        {
            
    Iterator<Downloaditerator downloadList.iterator();

            while (
    iterator.hasNext())
            {
                
    Download download iterator.next(); <------- questa riga da problemi

                System
    .out.println("staus: " download.getStatus()); // per il debug

                
    if (download.getStatus() == Download.COMPLETE || download.getStatus() == Download.CANCELLED)
                {
                    
    clearDownload(downloadList.indexOf(download));
                }
            }
        }

     public 
    void clearDownload(int row)
        {        
            
    downloadList.remove(row);

            
    // Fire table row deletion notification to table.
            
    fireTableRowsDeleted(rowrow);
        } 
    Come posso risolvere? Grazie

    edit: ah, l'eccezione salta fuori solo se ci sono almeno due download nell'array list (non importa se completati o meno). Con un solo download il metodo termina correttamente :|

    edit2: ho provato anche a sincronizzare l'accesso all'arraylist ma niente
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Non lo puoi fare così.
    Stai cercando di rimuovere un elemento da una lista che stai, contemporaneamente, scorrendo con un Iterator.

    La cosa più semplice è cercare di farne una copia e utilizzare quest'ultima per lo scorrimento.

    L'alternativa è quella di "tenere traccia" da qualche parte delle modifiche da apportare, quindi attuarle dopo lo scorrimento. Ad esempio, se devi togliere degli elementi da una lista, ne memorizzi l'indice in un array e, alla fine, scorri l'array rimuovendo gli oggetti tramite il loro indice.

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    :-O

    Ma quanto sono scemo! Grazie mille, ora ho capito!

    Ciao
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    L'unica operazione di modifica sulla collezione che è fattibile mentre si sta iterando, è il remove() dell'Iterator. Qualunque altra modifica con altri metodi, comporta l'eccezione che hai già sperimentato.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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.