Autor Tema: java.util.ConcurrentModificationException Java con iterator Ejercicio CU00688B  (Leído 3629 veces)

Dan_SB

  • Avanzado
  • ****
  • Mensajes: 273
  • *<DanielsCK>*
    • Ver Perfil
Buenos dias!

Vengo a resolver el ejercicio del capitulo 88° del curso, se trata de recorrer una lista que contiene varios tipos de objetos con el código del ejercicio anterior. Hice un cambio pequeñito en la super clase Producto, le inserte el atributo nombre para que se vea claro de que producto se trata (y objeto!):

Clase Producto:
Código: [Seleccionar]
package comidaHerencia;

public class Producto {
    String nombre, fechaCaducidad, numeroLote, fechaEnvasado, paisDeOrigen;
   
    public Producto(String nombre, String fechaCaducidad, String numeroLote, String fechaEnvasado, String paisDeOrigen){
        this.fechaCaducidad = fechaCaducidad;
        this.numeroLote = numeroLote;
        this.fechaEnvasado = fechaEnvasado;
        this.paisDeOrigen = paisDeOrigen;
        this.nombre = nombre;
    }
   
    public void setNombreProducto(String name){
        nombre = name;
    }
   
    public void setFechaCaducidad(String fecha){
        fechaCaducidad = fecha;
    }
   
    public void setNumeroLote(String num){
        numeroLote = num;
    }
   
    public void setFechaEnvasado(String fecha){
        fechaEnvasado = fecha;
    }
   
    public void setPaisDeOrigen(String pais){
        paisDeOrigen = pais;
    }
   
    public String getNombreProducto(){
        return nombre;
    }
       
    public String getFechaCaducidad(){
        return fechaCaducidad;
    }
   
    public String getNumeroLote(){
        return numeroLote;
    }
   
    public String getFechaEnvasado(){
        return fechaEnvasado;
    }
   
    public String getPaisDeOrigen(){
        return paisDeOrigen;
    }
   
    public void imprimirInfo(){
        System.out.println("Nombre del producto: " + getNombreProducto() + "\nFecha Caducidad: " + getFechaCaducidad() + "\nNumero de Lote: " + getNumeroLote() + "\nFecha de Envasado: " + getFechaEnvasado() + "\nPais de Origen: " + getPaisDeOrigen() + "\n");
    }
}

Clase ProductoFresco:
Código: [Seleccionar]
package comidaHerencia;

public class ProductoFresco extends Producto {   
    public ProductoFresco(String nombre, String fechaCaducidad, String numeroLote, String fechaEnvasado, String paisDeOrigen){
        super(nombre, fechaCaducidad, numeroLote, fechaEnvasado, paisDeOrigen);
    }   
}

Clase ProductoRefrigerado:
Código: [Seleccionar]
package comidaHerencia;

public class ProductoRefrigerado extends Producto{
    private String codigoSupervisionAlimentaria;
   
    public ProductoRefrigerado(String nombre, String fechaCaducidad, String numeroLote, String fechaEnvasado, String paisDeOrigen, String codigo){
        super(nombre, fechaCaducidad, numeroLote, fechaEnvasado, paisDeOrigen);
        codigoSupervisionAlimentaria = codigo;
    }
   
    public void setCodigoSupervisionAlimentaria(String codigo){
        codigoSupervisionAlimentaria = codigo;
    }
   
    public String getCodigoSupervisionAlimentaria(){
        return codigoSupervisionAlimentaria;
    }
   
    public void imprimirDatos(){
        System.out.println("Codigo de Supervision Alimentaria: " + getCodigoSupervisionAlimentaria());
        imprimirInfo();       
    }
}

Clase ProductoFrio:
Código: [Seleccionar]
package comidaHerencia;

public class ProductoFrio extends Producto {
    private double tempCongelacionRecomendada;
   
    public ProductoFrio(String nombre, String fechaCaducidad, String numeroLote, String fechaEnvasado, String paisDeOrigen, double tempCongelacionRecomendada){
        super(nombre, fechaCaducidad, numeroLote, fechaEnvasado, paisDeOrigen);
        this.tempCongelacionRecomendada = tempCongelacionRecomendada;
    }
   
    public void setTemperaturaRecomendada(double temperatura){
        tempCongelacionRecomendada = temperatura;
    }
   
    public double getTemperaturaRecomendada(){
        return tempCongelacionRecomendada;
    }
   
    public void imprimirInformacion(){
        System.out.println("Temperatura Recomendada: " + getTemperaturaRecomendada());
        imprimirInfo();
    }
}

Clase ProductoCongelado:
Código: [Seleccionar]
package comidaHerencia;

public class ProductoCongelado extends ProductoFrio {     
    public ProductoCongelado(String nombre, String fechaCaducidad, String numeroLote, String fechaEnvasado, String paisDeOrigen, double tempCongelacionRecomendada){
        super(nombre, fechaCaducidad, numeroLote, fechaEnvasado, paisDeOrigen, tempCongelacionRecomendada);
    }
}

Clase CongeladoAgua:
Código: [Seleccionar]
package comidaHerencia;

public class CongeladoAgua extends ProductoCongelado {
    private double gramosSal, litrosAgua;
    public CongeladoAgua(String nombre, String fechaCaducidad, String numeroLote, String fechaEnvasado, String paisDeOrigen, double tempCongelacionRecomendada){
        super(nombre, fechaCaducidad, numeroLote, fechaEnvasado, paisDeOrigen, tempCongelacionRecomendada);
        gramosSal = 0; litrosAgua = 0;
    } 
    public void setSal(double sal){gramosSal = sal;}
    public void setLitrosAgua(double litro){litrosAgua = litro;}
    public double calcularSalinidad(){
        double salinidad = gramosSal * litrosAgua;
        return salinidad;
    }
    public double getSal(){return gramosSal;}
    public double getLitrosAgua(){return litrosAgua;}
   
    public void imprimirDatos(){
        System.out.println("Salinidad del agua: " + calcularSalinidad());
        imprimirInformacion();     
    }
}

Clase CongeladoAire:
Código: [Seleccionar]
package comidaHerencia;

public class CongeladoAire extends ProductoCongelado{
    private double porNitrogeno, porOxigeno, porDioxCarbono, porVaporAgua;
    public CongeladoAire(String nombre, String fechaCaducidad, String numeroLote, String fechaEnvasado, String paisDeOrigen, double tempCongelacionRecomendada){
        super(nombre, fechaCaducidad, numeroLote, fechaEnvasado, paisDeOrigen, tempCongelacionRecomendada);
        porNitrogeno = 0; porOxigeno = 0; porDioxCarbono = 0; porVaporAgua = 0;
    }   
   
    public void setPorNitrogeno(double num){porNitrogeno = num;}   
    public void setPorOxigeno(double num){porOxigeno = num;}   
    public void setPorDioxCarbono(double num){porDioxCarbono = num;}
    public void setPorVaporAgua(double num){porVaporAgua = num;}
    public double getPorNitrogeno(){return porNitrogeno;}
    public double getPorOxigeno(){return porOxigeno;}
    public double getPorDioxCarbono(){return porDioxCarbono;}
    public double getPorVaporAgua(){return porVaporAgua;}
   
    public void imprimirDatos(){
        System.out.println("Porcentaje de nitrogeno: " + getPorNitrogeno() + "%\nPorcentaje de oxigeno: " + getPorOxigeno() + "%\nPorcentaje de Dioxido de carbono: "
        + getPorDioxCarbono() + "%\nPorcentaje de vapor de agua: " + getPorVaporAgua());
        imprimirInformacion();       
    }
}

Clase CongeladoNitrogeno:
Código: [Seleccionar]
package comidaHerencia;

public class CongeladoNitrogeno extends ProductoCongelado{
    private String metodoCongelacion;
    private String tiempoExposicion;
    public CongeladoNitrogeno(String nombre, String fechaCaducidad, String numeroLote, String fechaEnvasado, String paisDeOrigen, double tempCongelacionRecomendada){
         super(nombre, fechaCaducidad, numeroLote, fechaEnvasado, paisDeOrigen, tempCongelacionRecomendada);
         metodoCongelacion = "Desconocido";
         tiempoExposicion = "";
    }
   
    public void setMetodoCongelacion(String metodo){metodoCongelacion = metodo;}
    public void setTiempoExposicion(String tiempo){tiempoExposicion = tiempo;}
    public String getMetodoCongelacion(){return metodoCongelacion;}
    public String getTiempoExposicion(){return tiempoExposicion;}
   
    public void imprimirDatos(){
        System.out.println("Metodo de congelacion: " + getMetodoCongelacion() + "\nTiempo de exposicion: " + getTiempoExposicion());
        imprimirInformacion();       
    }
}

Clase EnvioDeProductos:
Código: [Seleccionar]
package comidaHerencia;
import java.util.ArrayList;

public class EnvioDeProductos{
    ArrayList<Producto> orden;
    public EnvioDeProductos(){orden = new ArrayList<Producto>();}   
    public void añadirProducto(Producto P){orden.add(P);}
}

Clase testHerencia3:
Código: [Seleccionar]
package comidaHerencia;

public class testHerencia3 {
    public static void main(String[]args){     
        EnvioDeProductos envio = new EnvioDeProductos();
        ProductoFresco tomate = new ProductoFresco("Tomate Perita","30/04/2015","L1021015","20/04/2015","Panamá");
        ProductoFresco manzana = new ProductoFresco("Manzanas","03/05/2015","L1022015","20/04/2015","EEUU");
        ProductoRefrigerado leche = new ProductoRefrigerado("Leche Estrella Azul","10/05/2015","L1118015","24/04/2015","España","C#12083");
        ProductoRefrigerado jugo = new ProductoRefrigerado("Jugo de naranja aleman","14/05/2015","L0912015","20/04/2015","Alemania","C#56785");
        ProductoRefrigerado queso = new ProductoRefrigerado("Queso nestle","14/05/2015","L1112015","02/04/2015","Panamá","C#67890");
        CongeladoAgua pescado = new CongeladoAgua("Corvina","14/7/2015","L2032015","10/04/2015","Panamá",-2.0);
        pescado.setLitrosAgua(5);
        pescado.setSal(283.5);
        CongeladoAgua cangrejo = new CongeladoAgua("Centella","15/8/2015","L1023015","11/04/2015","Panamá",-2.0);
        cangrejo.setLitrosAgua(3);
        cangrejo.setSal(170.1);
        CongeladoAgua rex = new CongeladoAgua("Vaca xxx","15/6/2015","L2012015","11/04/2015","Costa Rica",-1.8);
        rex.setLitrosAgua(5);
        rex.setSal(170.1);
        CongeladoAgua pulpo = new CongeladoAgua("Blue Ice","15/6/2015","L2309015","16/05/2015","Colombia",-2.0);
        pulpo.setLitrosAgua(2);
        pulpo.setSal(113.4);
        CongeladoNitrogeno cordero = new CongeladoNitrogeno("Cordero","20/6/2015","L2609015","20/05/2015","Argentina",-2.2);
        cordero.setMetodoCongelacion("Criogénica");
        cordero.setTiempoExposicion("6 meses");
        envio.añadirProducto(tomate);
        envio.añadirProducto(manzana);
        envio.añadirProducto(leche);
        envio.añadirProducto(jugo);
        envio.añadirProducto(queso);
        envio.añadirProducto(pescado);
        envio.añadirProducto(cangrejo);
        envio.añadirProducto(rex);
        envio.añadirProducto(pulpo);
        envio.añadirProducto(cordero);
        System.out.println("Productos del envio:");
        for(Producto aux: envio.orden){
            System.out.print("Nombre del producto: " + aux.getNombreProducto() + "\n" + "Fecha de envasado: " + aux.getFechaEnvasado() + "\n"
                    + "Fecha de caducidad: " + aux.getFechaCaducidad() + "\n" + "Numero de lote: " + aux.getNumeroLote() + "\n"
                    + "Pais de origen: " + aux.getPaisDeOrigen() + "\n\n");
        }
    }
}

Los cambios no eran la gran cosa, pero igual se los subo aquí!

Ejecucion:
« Última modificación: 26 de Abril 2015, 13:27 por Alex Rodríguez »
"Luchar por tus sueños y cumplirlos... eso es vivir.."

Dan_SB

  • Avanzado
  • ****
  • Mensajes: 273
  • *<DanielsCK>*
    • Ver Perfil
Re:Ejercicio (CU00688B), El array polimofico.
« Respuesta #1 en: 22 de Abril 2015, 21:48 »
Pff que tonto que fui, tenia un metodo para mostrar informacion que no use. Tras eso era con iterator.. aw.. -___-

Bueno, arreglando mi solución anterior:
Código: [Seleccionar]
package comidaHerencia;

public class Producto {
    String nombre, fechaCaducidad, numeroLote, fechaEnvasado, paisDeOrigen;
   
    public Producto(String nombre, String fechaCaducidad, String numeroLote, String fechaEnvasado, String paisDeOrigen){
        this.fechaCaducidad = fechaCaducidad;
        this.numeroLote = numeroLote;
        this.fechaEnvasado = fechaEnvasado;
        this.paisDeOrigen = paisDeOrigen;
        this.nombre = nombre;
    }
   
    public void setNombreProducto(String name){
        nombre = name;
    }
   
    public void setFechaCaducidad(String fecha){
        fechaCaducidad = fecha;
    }
   
    public void setNumeroLote(String num){
        numeroLote = num;
    }
   
    public void setFechaEnvasado(String fecha){
        fechaEnvasado = fecha;
    }
   
    public void setPaisDeOrigen(String pais){
        paisDeOrigen = pais;
    }
   
    public String getNombreProducto(){
        return nombre;
    }
       
    public String getFechaCaducidad(){
        return fechaCaducidad;
    }
   
    public String getNumeroLote(){
        return numeroLote;
    }
   
    public String getFechaEnvasado(){
        return fechaEnvasado;
    }
   
    public String getPaisDeOrigen(){
        return paisDeOrigen;
    }
   
    public String imprimirInfo(){
        return "Nombre del producto: " + getNombreProducto() + "\nFecha Caducidad: " + getFechaCaducidad() +
                "\nNumero de Lote: " + getNumeroLote() + "\nFecha de Envasado: " + getFechaEnvasado() +
                "\nPais de Origen: " + getPaisDeOrigen() + "\n\n";
    }
}

Clase Test:
Código: [Seleccionar]
package comidaHerencia;

public class testHerencia3 {
    public static void main(String[]args){
        EnvioDeProductos envio = new EnvioDeProductos();
        ProductoFresco tomate = new ProductoFresco("Tomate Perita","30/04/2015","L1021015","20/04/2015","Panamá");
        ProductoFresco manzana = new ProductoFresco("Manzanas","03/05/2015","L1022015","20/04/2015","EEUU");
        ProductoRefrigerado leche = new ProductoRefrigerado("Leche Estrella Azul","10/05/2015","L1118015","24/04/2015","España","C#12083");
        ProductoRefrigerado jugo = new ProductoRefrigerado("Jugo de naranja aleman","14/05/2015","L0912015","20/04/2015","Alemania","C#56785");
        ProductoRefrigerado queso = new ProductoRefrigerado("Queso nestle","14/05/2015","L1112015","02/04/2015","Panamá","C#67890");
        CongeladoAgua pescado = new CongeladoAgua("Corvina","14/7/2015","L2032015","10/04/2015","Panamá",-2.0);
        pescado.setLitrosAgua(5);
        pescado.setSal(283.5);
        CongeladoAgua cangrejo = new CongeladoAgua("Centella","15/8/2015","L1023015","11/04/2015","Panamá",-2.0);
        cangrejo.setLitrosAgua(3);
        cangrejo.setSal(170.1);
        CongeladoAgua rex = new CongeladoAgua("Vaca xxx","15/6/2015","L2012015","11/04/2015","Costa Rica",-1.8);
        rex.setLitrosAgua(5);
        rex.setSal(170.1);
        CongeladoAgua pulpo = new CongeladoAgua("Blue Ice","15/6/2015","L2309015","16/05/2015","Colombia",-2.0);
        pulpo.setLitrosAgua(2);
        pulpo.setSal(113.4);
        CongeladoNitrogeno cordero = new CongeladoNitrogeno("Cordero","20/6/2015","L2609015","20/05/2015","Argentina",-2.2);
        cordero.setMetodoCongelacion("Criogénica");
        cordero.setTiempoExposicion("6 meses");
        envio.añadirProducto(tomate);
        envio.añadirProducto(manzana);
        envio.añadirProducto(leche);
        envio.añadirProducto(jugo);
        envio.añadirProducto(queso);
        envio.añadirProducto(pescado);
        envio.añadirProducto(cangrejo);
        envio.añadirProducto(rex);
        envio.añadirProducto(pulpo);
        envio.añadirProducto(cordero);
        System.out.println("Productos del envio:");
        for(Producto aux: envio.orden){
            System.out.print(aux.imprimirInfo());
        }
    }
}

Corre exactamente igual, ya ando con el tema del iterator, tan pronto resuelva lo subo aqui!
"Luchar por tus sueños y cumplirlos... eso es vivir.."

Dan_SB

  • Avanzado
  • ****
  • Mensajes: 273
  • *<DanielsCK>*
    • Ver Perfil
Una ayuda urgente :(
« Respuesta #2 en: 24 de Abril 2015, 17:36 »
Hola de nuevoo, es que he intentado de todo para que el iterator recorra la lista pero todo fue sin exito. Tuve que hasta recurrir a ver otras respuestas en este foro, pero q va, sigue sin funcionar... ¿Que tendré incorrecto?

Código: [Seleccionar]
import java.util.Iterator;

public class testHerencia4 {
    public static void main(String[]args){
        EnvioDeProductos envio = new EnvioDeProductos();
        Iterator <Producto> recorre = envio.getEnvio().iterator();
        ProductoFresco tomate = new ProductoFresco("Tomate Perita","30/04/2015","L1021015","20/04/2015","Panamá");
        ProductoFresco manzana = new ProductoFresco("Manzanas","03/05/2015","L1022015","20/04/2015","EEUU");
        ProductoRefrigerado leche = new ProductoRefrigerado("Leche Estrella Azul","10/05/2015","L1118015","24/04/2015","España","C#12083");
        ProductoRefrigerado jugo = new ProductoRefrigerado("Jugo de naranja aleman","14/05/2015","L0912015","20/04/2015","Alemania","C#56785");
        ProductoRefrigerado queso = new ProductoRefrigerado("Queso nestle","14/05/2015","L1112015","02/04/2015","Panamá","C#67890");
        CongeladoAgua pescado = new CongeladoAgua("Corvina","14/7/2015","L2032015","10/04/2015","Panamá",-2.0);
        pescado.setLitrosAgua(5);
        pescado.setSal(283.5);
        CongeladoAgua cangrejo = new CongeladoAgua("Centella","15/8/2015","L1023015","11/04/2015","Panamá",-2.0);
        cangrejo.setLitrosAgua(3);
        cangrejo.setSal(170.1);
        CongeladoAgua rex = new CongeladoAgua("Vaca xxx","15/6/2015","L2012015","11/04/2015","Costa Rica",-1.8);
        rex.setLitrosAgua(5);
        rex.setSal(170.1);
        CongeladoAgua pulpo = new CongeladoAgua("Blue Ice","15/6/2015","L2309015","16/05/2015","Colombia",-2.0);
        pulpo.setLitrosAgua(2);
        pulpo.setSal(113.4);
        CongeladoNitrogeno cordero = new CongeladoNitrogeno("Cordero","20/6/2015","L2609015","20/05/2015","Argentina",-2.2);
        cordero.setMetodoCongelacion("Criogénica");
        cordero.setTiempoExposicion("6 meses");
        envio.añadirProducto(tomate);
        envio.añadirProducto(manzana);
        envio.añadirProducto(leche);
        envio.añadirProducto(jugo);
        envio.añadirProducto(queso);
        envio.añadirProducto(pescado);
        envio.añadirProducto(cangrejo);
        envio.añadirProducto(rex);
        envio.añadirProducto(pulpo);
        envio.añadirProducto(cordero);
        System.out.println("Productos del envio:");
        while(recorre.hasNext()){
            Producto aux = recorre.next();
            aux.imprimirInfo();
        }
    }
}

Código: [Seleccionar]
package comidaHerencia;
import java.util.ArrayList;

public class EnvioDeProductos{
    ArrayList<Producto> orden;
    public EnvioDeProductos(){orden = new ArrayList<Producto>();}   
    public void añadirProducto(Producto P){orden.add(P);}
    public ArrayList<Producto> getEnvio(){ return orden;}
}
"Luchar por tus sueños y cumplirlos... eso es vivir.."

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Re:Ejercicio (CU00688B), El array polimofico.
« Respuesta #3 en: 24 de Abril 2015, 22:34 »
Hola Dan, a mí me salta un error java.util.ConcurrentModificationException al invocar recorre.next()

        while(recorre.hasNext()){
            Producto aux = recorre.next();
            aux.imprimirInfo();
        }


Puede haber varios problemas, el primero de ellos es que el iterador crea una copia del objeto en el momento en que se crea el iterador. Tú estás creando el iterador al principio, cuando el objeto está vacío.

        EnvioDeProductos envio = new EnvioDeProductos();
        Iterator <Producto> recorre = envio.getEnvio().iterator();


Pero el iterador se debe crear justo antes de recorrer una colección, no en cualquier momento:

       Iterator <Producto> recorre = envio.getEnvio().iterator();
        while(recorre.hasNext()){
            Producto aux = recorre.next();
            aux.imprimirInfo();
        }

También ten en cuenta que el método imprimirInfo tiene un nombre equívoco: el método no imprime, sino que devuelve un String, por tanto mejor llamarlo getInfo() o similar

Prueba con estos pequeños cambios:

Código: [Seleccionar]
        Iterator <Producto> recorre = envio.getEnvio().iterator();
        while(recorre.hasNext()){
            Producto aux = recorre.next();
            System.out.println(aux.imprimirInfo());
        }

Y recuerda ponerle nombres correctos a clases y métodos... si no es fácil incurrir en equivocaciones.

Saludos

Dan_SB

  • Avanzado
  • ****
  • Mensajes: 273
  • *<DanielsCK>*
    • Ver Perfil
Re:java.util.ConcurrentModificationException Java Ejercicio CU00688B
« Respuesta #4 en: 25 de Abril 2015, 02:28 »
Wow! no pense que por un detalle tan pequeño no corria el programa, vaya!! dato super util!!! Gracias!!!  ;D
"Luchar por tus sueños y cumplirlos... eso es vivir.."

 

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".