Foros aprenderaprogramar.com
Aprender a programar => Aprender a programar desde cero => Mensaje iniciado por: Viktorius en 11 de Marzo 2019, 20:36
-
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:
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
-
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.
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);
}
}
-
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?
-
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 (https://www.aprenderaprogramar.com/index.php?option=com_content&view=article&id=632:el-for-extendido-o-bucles-for-each-en-java-ventajas-e-inconvenientes-ejercicio-ejemplo-resuelto-cu00666b&catid=68&Itemid=188)" 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 he creado metodos porque son ejercicios muy simples. Y muchas gracias por la ayuda Kabuto. ;)