Usuwanie obiektów z kolekcji

0

Witam,
jestem w trakcie pisania aplikacji klient/serwer opartej na RMI. Na serwerze przechowuje w liscie dodane przed administratora produkty, ktore chce takze usuwac. Niestety kiedy chce usunac obiekt z listy wyrzuca mi wyjątek: java.util.ConcurrentModificationException

Tworze przykładowe 2 produkty, kazdy podczas tworzenia ma przypisywane autoID i wg tego ID chce usuwac produkty:

Product p1 = new Product( "p1", "pr1", 2.5, 10 );
Product p2 = new Product( "p2", "pr2", 3.7, 8 );

Tak wyglada zdalna metoda do usuwania tych produktów:

@Override
	public void removeProduct( int productID ) throws RemoteException {
		for( Product product: productList ) {	
			if( product.getProductID() == productID ) {
				productList.remove( product );
			}
		}
		throw new RemoteException( "Nie mozna usunac produktu o ID: " + productID );
	}

Po probie usuniecia np produktu "p1" o ID=0 dostaje:

java.util.ConcurrentModificationException
	at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
	at java.util.ArrayList$Itr.next(Unknown Source)
	at model.remoteObject.Shop.removeProduct(Shop.java:66) 

gdzie kompilator w 66 linii pokazuje na początek pętli for:

 for( Product product: productList ) {

Nie rozumiem na czym polega tutaj problem ani jak go rozwiązać, czy ktoś byłby w stanie coś zaradzić?

1

Tu nie chodzi o RMI. Nie usuwa się obiektów z kolekcji jak się po niej iteruje. Już lepiej kopiować elementy, których nie usunąłeś.
http://stackoverflow.com/questions/223918/iterating-through-a-list-avoiding-concurrentmodificationexception-when-removing

Jak masz Jave 8:
http://docs.oracle.com/javase/8/docs/api/java/util/Collection.html#removeIf-java.util.function.Predicate-

0

Super pomogłeś mi rozwiązać problem :)

Metode zrobiłem tak:

 public void removeProduct( int productID ) throws RemoteException {
		Iterator< Product > i = productList.iterator();
		while( i.hasNext() ) {
			Product product = i.next();
			if( product.getProductID() == productID ) {
				i.remove();
			}
		}
}
0

Lepiej, ale Iterator nie musi implementowac remove(). Jak zmienisz kolekcje i okaze sie, ze iterator nie ma remove to co wtedy?
Ja zawsze usuwam od konca (wyjdajniesze dla ArrayList):

for (int i = productList.size() -1 ; i >= 0; i--) {
    if(productList.get(i).getProductId() == productId) {
      productList.remove(i);
      return;
    }
}

BTW: Zgubiles return po remove() ?

0 użytkowników online, w tym zalogowanych: 0, gości: 0