Autor Tema: Java: Exception java.util.ConcurrentModificationException iterator hasNext bucle  (Leído 3081 veces)

Viktorius

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 3
    • Ver Perfil
Buenas, estoy estudiando Java y haciendo pruebas con ArrayList a la hora de usar el iterador me sale la excepcion del asunto "Exception java.util.ConcurrentModificationException" y no veo el error aun habiendo comparado con alguno ejemplo. Este es mi código:


Código: [Seleccionar]
package ejer3;

import java.util.ArrayList;
import java.util.Iterator;


import ejer2.Producto;

public class Testeje3 {

public static void main(String[] args) {
ArrayList<Producto> superm = new ArrayList<>();
Iterator<Producto> it = superm.iterator();
double finalP=0;
Producto prod;

superm.add(new Producto("Leche", 2, 1.79));
superm.add(new Producto("Galle", 4, 1.29));
superm.add(new Producto("Zumo", 1, 1.52));

while(it.hasNext()) {
prod = it.next();
System.out.print(prod.getNombre()+ "          ");
System.out.print(prod.getCantidad()+ "        ");
System.out.print(prod.precioFinal());
System.out.println();
finalP+= prod.precioFinal();
}
System.out.println("Precio final" + finalP);

}

}
Alguien puede echarme una mano? Gracias
« Última modificación: 04 de Junio 2020, 18:47 por Alex Rodríguez »

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 985
    • Ver Perfil
Re:Java: Exception java.util.ConcurrentModificationException
« Respuesta #1 en: 11 de Marzo 2019, 23:30 »
Hola.

El problema está en que tú primero creas el Iterador y luego añades Productos.

Esto implica que el Iterador no tiene constancia de estos nuevos Productos que has añadido, él mismo lo detecta y por lo tanto te lanza esa excepción de "Modificación Concurrente"... que viene a significar algo así como que estás modificando al mismo tiempo que estás iterando..

Lo que tienes que hacer es añadir primero los productos y DESPUES creas el Iterador.


Código: [Seleccionar]
public class Testeje3 {

public static void main(String[] args) {
ArrayList<Producto> superm = new ArrayList<>();

double finalP=0;
Producto prod;

superm.add(new Producto("Leche", 2, 1.79));
superm.add(new Producto("Galle", 4, 1.29));
superm.add(new Producto("Zumo", 1, 1.52));

Iterator<Producto> it = superm.iterator();

while(it.hasNext()) {
prod = it.next();
System.out.print(prod.getNombre()+ "          ");
System.out.print(prod.getCantidad()+ "        ");
System.out.print(prod.precioFinal());
System.out.println();
finalP+= prod.precioFinal();
}
System.out.println("Precio final" + finalP);

}

}
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

Viktorius

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 3
    • Ver Perfil
Re:Java: Exception java.util.ConcurrentModificationException
« Respuesta #2 en: 12 de Marzo 2019, 07:58 »
Vaya, muchas gracias Kabuto. La verdad es que tiene sentido, pero a la hora de modificar la lista no es un problema? o se hace desde el iterador?

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 985
    • Ver Perfil
Re:Java: Exception java.util.ConcurrentModificationException
« Respuesta #3 en: 12 de Marzo 2019, 12:11 »
Sí, si es un problema.
Si añades o eliminas elementos de un List o derivados (como ArrayList) mientras "iteras", el Iterador se quejará.

Se podría subsanar este problema creando sublistas temporales, una con elementos para añadir, otra con elementos para eliminar... y tras finalizar la iteración consultamos estas sublistas para actualizar el ArrayList principal añadiendo y quitando los elementos que correspondan y así la próxima vez que creemos el Iterator los cambios ya estarán hechos.

O bien, tras cada cambio realizado, volver a instanciar el Iterador para que este actualizado al momento. Esto cuando vayas aprendiendo a separar tu programa en subprogramas (métodos) que se encarguen de pequeñas tareas concretas, será más fácil de lo que parece.
Además normalmente preferirás dar opciones específicas al usuario:
1º Añadir Producto..
2º Eliminar Producto...
3º Mostrar listado de Productos actual...

De modo que no te verás en la tesitura de "Añadir un Producto" durante el proceso de "Mostrar listado", ya que serán subprocesos distintos y para "Añadir Producto" no necesitas iterar, tan solo pedir datos, crear un objeto Producto y añadirlo al ArrayList.
Luego cuando el usuario eliga opcion 3 "Mostrar Listado", en ese momento podrás crear un Iterador tranquilamente porque dentro de esta opción no vas a dar la posibilidad de añadir o eliminar productos.


Por otra parte, he de decir que no soy programador profesional ni por asomo. Soy poco más que un aprendiz algo avanzadillo...
Pero en realidad, nunca he necesitado usar iteradores para recorrer los ArrayList.

Suelo usar indices si van a haber modificaciones o si solo necesito recorrerlo para mostrar y computar datos, como es el caso de tu programa, uso un cómodo "for each" y listo.


En definitiva, no te agobies con este "limitación" del Iterator, no solo hay formas de subsanarla, sino que en realidad posiblemente muy pocas veces necesites usar un iterador para moverte por los ArrayList.

NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

Viktorius

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 3
    • Ver Perfil
Re:Java: Exception java.util.ConcurrentModificationException
« Respuesta #4 en: 12 de Marzo 2019, 17:32 »
No he creado metodos porque son ejercicios muy simples. Y muchas gracias por la ayuda Kabuto. ;)

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".