Páginas

22/8/14

java.util.ConcurrentModificationException

java.util.ConcurrentModificationException

Excepcion java.util.ConcurrentModificationException



Un tip sobre esta excepción que nos aparece en pantalla cuando estamos programado, esto ocurre cuando queremos modificar un objeto mientras un thread esta iterando sobre ese mismo objeto. Para entendernos mejor, supongamos que tenemos una lista de profesores, y la estamos recorriendo con un bucle for-each para mostrar todos los nombres de los profesores y en ese mismo recorrido queremos borrar al profesor que tiene el nombre de "PEPE PEREZ" y supongamos que hay dos objetos en la lista con ese nombre, bueno fácilmente nos dará la excepción ConcurrentModificationException porque queremos borrar un registro mientras estamos recorriendo la lista, el primer registro lo borrara pero cuando intente borrar el segundo lanza la excepción. Como hacemos ahora, tenemos que recorrer primero la lista y guardar el registro que queremos borrar, para después de haber recorrido la lista borrarlo? Parecen muchos pasos para algo tan sencillo. Bueno primero déjame contarte que hay varias maneras de iterar sobre una lista y uno de ellos es el Iterator el cual tiene una diferencia con el for-each que si nos permite borrar mientras estamos iterando sobre la lista y no importa si es un registro repetido o no. Bueno veamos cómo es en una mini práctica.

for-each
ArrayList lista = new ArrayList();
lista.add("PEPE PEREZ");
lista.add("ALAN BRITO");
lista.add("ZOILA VACA");
lista.add("PEPE PEREZ");
lista.add("ZOIDE LACALLE");

//Recorrer la lista con un for
for (String nombre : lista) {
 if (nombre.equals("PEPE PEREZ")) {
  lista.remove("PEPE PEREZ");
 }
}
    

Cuando intentamos correr ese ejemplo lanza la excepción:

java.util.ConcurrentModificationException
      
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
at java.util.ArrayList$Itr.next(Unknown Source)
      
    


Entonces para resolver esto rápido y de una manera eficaz reemplazamos el for-each por un Iterator. Esta es la diferencia entre el for-each y el Iterator, en cuanto a consumo de recursos no hay mucha diferencia así que no te preocupes.

Iterator
 
Iterator iterator = lista.iterator();
 while (iterator.hasNext()) {
 String nombre = iterator.next();
 if (nombre.equals("PEPE PEREZ")) {
  iterator.remove();
 }
}
    

Ahora si funciona, en conclusión de este dato java se podría decir que es más recomendable usar el bucle for-each que el iterator ya que es mas fácil de usar y mas nuevo. En fin de cuentas depende de que le quieran hacer a la lista que están recorriendo.


Temas Relacionados:

No hay comentarios :

Publicar un comentario