Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    339

    problema con java.util.ConcurrentModificationException

    Ciao a tutti.

    Ho un problema con una java.util.ConcurrentModificationException che probabilmente si verifica perchè utilizzo nello stesso tempo due iteratori per fare la rimozione di un oggetto.

    Praticamente ho una Jtable che visualizza il contenuto di una TreeSet.

    In questa TreeSet ci sono degli oggetti di tipo Articolo , ogni articolo ha come attributi tipologia , marca , modello , caratteristiche , quantità , prezzo , codiceArticolo.

    Questi oggetti vengono "rappresentati" su un defaultTableModel di Jtable.Ogni riga rappresenta un oggetto ; ogni colonna un suo attributo (tipologia , marca ecc...);

    Ho scritto del codice per fare la rimozione di un articolo ;
    quello che fa sostanzialmente è di ricavare la riga cliccata , ricavare il codice articolo della riga cliccata , rimuovere l'articolo dalla treeset in base al codice articolo attraverso il metodo rimuoviArticolo(int codice) , rimuovere la riga selezionata.

    Il problema è che ogni tanto funziona , ogni tanto lancia l'eccezione java.util.ConcurrentModificationException.

    Mi è stato suggerito di utilizzare direttamente il metodo remove(Object o) di treeset.

    Non capisco però come utilizzarlo in questo contesto. Mi aiutate?

    Ecco il codice che fa il tutto :

    codice:
    rigaSelezionata = InterfacciaPrincipale.Jtable.getSelectedRow();
    valoreCodiceArticolo = InterfacciaPrincipale.modelloJTable.getValueAt(rigaSelezionata, InterfacciaPrincipale.modelloJTable.findColumn("CODICE ARTICOLO")).toString();
    	     
    InterfacciaPrincipale.Magazzino.rimuoviArticolo(Integer.parseInt(valoreCodiceArticolo));     
    	     
    InterfacciaPrincipale.modelloJTable.removeRow(rigaSelezionata);
    
    InterfacciaPrincipale.textareaEventiMagazzino.append(new Date().toString() + " : " + "\n" + "ARTICOLO RIMOSSO DAL MAGAZZINO : " + "[ " +tipologiaArticolo + " : " +marcaArticolo + " -- " +modelloArticolo +" ] ;" + "\n");
    	     clickBottoneSi.dispose();
    Questo è il metodo rimuoviArticolo :

    codice:
    	public boolean rimuoviArticolo(int codiceArticolo) {
    		
    		boolean rimosso = false;
    		Iterator<Articolo> it = treeset.iterator();
    		while(it.hasNext()){
    			Articolo art = it.next();
    			int codice = art.getCodiceArticolo();
    			if(codiceArticolo == codice)
    				treeset.remove(art);
    			rimosso = true;
    		}
    		return rimosso;
    	}// RIMUOVI ARTICOLO

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Markus85 Visualizza il messaggio
    codice:
    		Iterator<Articolo> it = treeset.iterator();
    		while(it.hasNext()){
    			Articolo art = it.next();
    			int codice = art.getCodiceArticolo();
    			if(codiceArticolo == codice)
    				treeset.remove(art);
    			rimosso = true;
    		}
    No, se stai usando l'Iterator del TreeSet e vuoi rimuovere un elemento, devi per forza farlo con il remove() del Iterator .... non con il remove della collezione.
    Il motivo è ben documentato nel javadoc di TreeSet.
    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
    Feb 2011
    Messaggi
    339
    Quote Originariamente inviata da andbin Visualizza il messaggio
    No, se stai usando l'Iterator del TreeSet e vuoi rimuovere un elemento, devi per forza farlo con il remove() del Iterator .... non con il remove della collezione.
    Il motivo è ben documentato nel javadoc di TreeSet.
    Cosi ?

    codice:
    	public boolean rimuoviArticolo(int codiceArticolo) {
    		
    		boolean rimosso = false;
    		Iterator<Articolo> it = treeset.iterator();
    		while(it.hasNext()){
    			Articolo art = it.next();
    			int codice = art.getCodiceArticolo();
    			if(codiceArticolo == codice)
    				it.remove();
    			rimosso = true;
    		}
    		return rimosso;
    	}// RIMUOVI ARTICOLO
    Riguardo la soluzione che mi era stata suggerita?
    Ossia di utilizzare il metodo remove(Object o) di treeset?

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    339
    Forse il prof non se ne accorto ma lo avevo utilizzato nel codice di prima

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    339
    Penso comunque abbia detto una cavolata....
    Con la tua dritta adesso funziona tutto alla perfezione

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.