martes, 14 de mayo de 2013

Como evitar un ConcurrentModificationException en Java

Esta mañana he tenido que lidiar con un error del tipo ConcurrentModificationException en una aplicación en Java. Esto sucede cuando se intenta borrar un elemento de una lista que se está iterando, como por ejemplo en el siguiente código:
List<String> myList = new ArrayList<String>();
myList.add("1");
myList.add("2");
myList.add("3");
myList.add("4");
myList.add("5");

Iterator<String> it = myList.iterator();
while(it.hasNext()){
   String value = it.next();
   System.out.println("List Value:"+value);
    if(value.equals("3")) myList.remove(value);
}
Mi caso no ha sido exactamente igual al que muestro aquí, este caso lo he sacado de la web donde encontré la solución a mi error y que os pondré más abajo. Como vemos estamos borrando un elemento de una lista a la misma vez que la iteramos. Esto es lo que nos provoca el pete ConcurrentModificationException ya que estamos accediendo a la lista con el iterator y a la misma vez borrando un elemento de la misma. 
Para solucionarlo tenemos que declararnos la lista de la siguiente forma:
List<String> myList = new CopyOnWriteArrayList<String>();
Ya no usamos un ArrayList sino CopyOnWriteArrayList. Esta clase hará que no veamos las modificaciones de nuestra lista hasta que no salgamos del bucle while y por lo tanto evitamos el error. 
Esta información la puedes encontrar también en aquí y aquí, estas fueron las fuentes que empleé para aprender.
Espero que os sirva!

No hay comentarios :

Publicar un comentario