Categorías
Collections

java.util.ConcurrentModificationException

Esta publicación muestra un programa para resolver el problema de java.util.ConcurrentModificationException por ArrayList.

El mensaje de error tiene el siguiente aspecto:

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

El problema

Es posible que desee iterar a través de un ArrayListy eliminar algún elemento en determinadas condiciones. Por ejemplo, el siguiente código parece razonable:

List<String> list = new ArrayList<String>();
list.add("A");
list.add("B");
list.add("C");
 
for (String s : list) {
    if (s.equals("B")) {
        list.remove(s);
    }
}

Ejecutar el código en realidad resultará en la siguiente excepción:

Solucion 1

Iterator se puede utilizar para resolver este problema. Iterators permitir que el llamador elimine elementos de la colección subyacente durante la iteración.

Iterator<String> iter = list.iterator();
while(iter.hasNext()){
    String str = iter.next();
    if( str.equals("B")){
        iter.remove();
    }
}

Solucion 2

En vez de ArrayList, CopyOnWriteArrayList se puede utilizar para resolver el problema. CopyOnWriteArrayList es una variante segura para subprocesos de ArrayList en el que todas las operaciones mutativas (agregar, establecer, etc.) se implementan haciendo una copia nueva de la matriz subyacente.

List<String> list = new CopyOnWriteArrayList<String>();
list.add("A");
list.add("B");
list.add("C");
 
for (String s : list) {
    if (s.equals("B")) {
        list.remove(s);
    }
}
  Las 9 preguntas principales sobre Java Maps

Esto es lo mismo para otras estructuras de datos, como HashSet, LinkedList, etc.

Por Programación.Click

Más de 20 años programando en diferentes lenguajes de programación. Apasionado del code clean y el terminar lo que se empieza. ¿Programamos de verdad?

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *