Problema con List

Amm tengo un problema pero es muy extraño, intentare no extenderme en la explicacion.

Estoy desarrollando una libreria que implementa un algoritmo sencillo, la idea que tengo es extender de una clase e implementar algunos metodos abstractos que tiene y el resto lo hace la libreria, estoy utilizando una lista para representar un estado, pero me sale una excepcion muy extraña si me pudieran ayudar, por ejemplo decirme casos curiosos en los que hayan tenido este problema o se me ocurre que al extender de una clase se crea otro hilo o algo por el estilo por que tengo entendido que este error se crea cuando hay varios hilos y mi aplicacion [con la que estoy probando esta libreria] es lineal.. solo tengo un main. asi que si se les ocurre algo muchas gracias, de cualquier forma si necesitan que ponga algo de codigo solo pidan...

Exception in thread "main" java.util.ConcurrentModificationException

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ArenasMx

ayudaria

pues si pudieras mostrar el código seria mas fácil, que los lenguajes de programación son libres de contexto y se supone que cualquiera que tenga los conocimientos suficientes puede saber que es lo que estas tratando de hacer...

según lo que dice la documentación

This exception may be thrown by methods that have detected concurrent modification of an object when such modification is not permissible.

imagino que habrá algún problema entre la clase de la que estas heredando y las interfaces que estas implementando.......

De hecho solo se necesitaba

De hecho solo se necesitaba el mensaje de error ( que pusiste al final )

Eso pasa cuando estás iterando una colección ( en este caso una lista - seguramente un arraylist -) y estás eliminando un elemento.

No puedes hacer esto:

oreyes@oreyes-laptop:~/code/languages/java$ cat > Cme.java <<.
> import java.util.*;
> class Cme {
>    public static void main( String ... args ) {
>       List list = new ArrayList();
>       list.addAll( Arrays.asList(1,2,3,4,5,6));
>       for( Object o : list ) {
>           list.remove( o ); //<-- Concurrent modification exception
>       }
>    }
> }
> .

oreyes@oreyes-laptop:~/code/languages/java$ javac Cme.java  
Note: Cme.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.

oreyes@oreyes-laptop:~/code/languages/java$ java Cme
Exception in thread "main" java.util.ConcurrentModificationException
        at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)
        at java.util.AbstractList$Itr.next(AbstractList.java:343)
        at Cme.main(Cme.java:6)

Eso en términos coloquiales ( y chilangos ) significa "Orale, orale, como quieres que recorra toda la lista si le estas quitando valores!!"

Si necesitas eliminar algunos elementos de una lista, puedes seleccionarlos en la iteración y luego eliminarlos:

oreyes@oreyes-laptop:~/code/languages/java$ cat > RemoveOk.java <<.
> import java.util.*;
>
> class RemoveOk {
>    public static void main( String ... args ) {
>       List<Integer> numeros = new ArrayList<Integer>( Arrays.asList(1,2,3,4,5,6,7,8,9,10));
>       List<Integer> pares   = new ArrayList<Integer>();
>       for( Integer i : numeros ) {
>          if( i % 2 == 0 ) {
>             pares.add( i );
>          }
>       }
>       numeros.removeAll( pares );
>       System.out.println( numeros );
>    }
> }
> .
oreyes@oreyes-laptop:~/code/languages/java$ javac RemoveOk.java
oreyes@oreyes-laptop:~/code/languages/java$
oreyes@oreyes-laptop:~/code/languages/java$ java RemoveOk
[1, 3, 5, 7, 9]
oreyes@oreyes-laptop:~/code/languages/java$

no manches eres buenisimo,

no manches eres buenisimo, gracias... no lo habia visto...
no te puedo dar puntos o algo? muy buena respuesta

Imagen de ezamudio

Iterator

También puedes usar un Iterator para recorrer una lista y además ir eliminando elementos:

List<Algo> lista;
for (Iterator<Algo> iter = lista.iterator(); iter.hasNext();) {
  Algo algo = iter.next();
  //hacer algo con algo
  if (algunaCondicion) {
    iter.remove(); //Esto quita el elemento actual de la lista, SIN causar problemas
  }
}

Pero esa excepción ConcurrentModificationException también sale si estás iterando sobre una lista y otro hilo la modifica. Pero si como dices, tu aplicación solamente tiene un hilo, es más probable que tu problema sea que eliminabas (o agregabas) elementos a una lista mientras la ibas recorriendo. Iterator tiene un método para quitar el elemento actual, pero si quieres agregarle elementos a la lista, tienes que usar una lista secundaria, como lo que hace Oscar pero al final en vez de removeAll, llamas addAll en tu lista primaria pasando la lista secundaria como argumento.

Imagen de nomarlegnar

Vientos

Excelentes soluciones caballeros, muy útiles ambas...