Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > Problema con java.util.ConcurrentModificationException

Estoy teniendo problemas no al compilar, si no al ejecutar el main, puesto que me aparece java.util.ConcurrentModificationException.

Tengo una clase que contiene el siguiente método:

public void borrarSesionSalaDesdeFechas(Sala salas,Date fechas){
for(Sala sali: this.salas){
if(salas.equals(salas))
sali.EliminarSesionPorFecha(fechas);
}
}

lo que quiero es que me recorra las siguientes salas para que cuando una coincida con la que le ponga en el main llame al método externo EliminarSesionPorFecha(fechas).

en este método, el cual muestro abajo, se insertará también la fecha que puse en el main y cuando coincida me borrará la sesión

public void EliminarSesionPorFecha(Date dos){
for(Sesion sdos : this.sesiones){if(sdos.getFecha().equals(dos)){System.out.println("La sesión ha sido borrada desde la fecha: ");
sesiones.remove(sdos);}}}

el problema es que me aparece el mensaje java.util.ConcurrentModificationException.

Ley que este tipo de problemas se puede solucionar con un iterador, pero me sigue apareciendo

mayo 13, 2015 | Unregistered CommenterRubén

¿Usas algún IDE, como NetBeans o Eclipse? Porque creo que la mayoría de los problemas que tienes ahora los solucionarías usando alguno de ellos. Los pocos errores que no te marcarían directamente según editas por no ser errores de compilación los encontrarías fácilmente ejecutando en modo depuración tu código. Por ejemplo, en el for que tienes en el método borrarSesionSalaDesdeFechas cada pasada del bucle da valor a la variable "sali", que luego no usas en la comparación del if.

Te haces un lío también con el nombre de los parámetros de los métodos. En borrarSesionSalaDesdeFechas estás pasando UNA sala y UNA fecha, así que no uses plurales ("salas", "fechas"), sobre todo cuando al hacerlo uno de los parámetros (salas) coincide en nombre con una de las propiedades de la clase (this.salas).

En cuanto a la excepción, sí, es verdad, es una pu**da incomodidad, pero no sirve usar el for mejorado directamente, hay que utilizar un iterador:


// Este for es de la forma for(init; condition; post-each-iter)
for (Iterator<Sesion> iterator = this.sesiones.iterator(); iterator.hasNext();) {
Sesion sdos = iterator.next();
// ...el resto igual, salvo cuando quieres eliminar un elemento de la colección
if (borrar) {
iterator.remove();
}
}

mayo 14, 2015 | Registered Commenterrickiees

Muchisimas gracias lo pruebo enseguida, la verdad soy nuevo en esto y me falta organización, menos mal que hay foros para preguntar porque te atascas y ya puedes tirarte días

un saludo y gracias

mayo 14, 2015 | Unregistered CommenterRubén