0

Buenas tengo un problema en un ejercicio de hilos donde hay un clase CestaManzanas y otra ComedorManzanas, el enunciado pide que entren 5 hilos y vayan comiendo manzanas de la cesta(la cesta tiene 750 manzanas) hasta que se terminen de 20 en 20 por cada vez que entra un hilo en la cesta, la cuestión es que me salta una excepción de java.lang.NullPointerException en la llamada al método comedor.manzana_comida();,además dentro del bucle for den bloque sincronizado sólo hace un iteración, no se porque no se completa... ¿alguna sugerencia? pego ambas clases.

package Hilos_Juanfran;

public class CestaManzanas{
    private int cantidad_manzanas =750;
    private int contador_comedores=0;
    private ComedorManzanas comedor;
    private int manzanas_comidas;
    private int lleno=20;
    
    public int getCantidad_manzanas() {
        return cantidad_manzanas;
    }

    public void setCantidad_manzanas(int cantidad_manzanas) {
        this.cantidad_manzanas = cantidad_manzanas;
    }

    public int getContador_comedores() {
        return contador_comedores;
    }

    public void setContador_comedores(int contador_comedores) {
        this.contador_comedores = contador_comedores;
    }

    public ComedorManzanas getComedor() {
        return comedor;
    }

    public void setComedor(ComedorManzanas comedor) {
        this.comedor = comedor;
    }

    public void entrar_cesta() {
        contador_comedores++;

        
            synchronized (this) {
                
            
                //Como el enunciado permite un máximo de 5 si lo supera ponemos el/los comedor/es a la espera
                if (contador_comedores>5) 
                    try {
                    wait();
                    }catch(Exception e) {
                        e.printStackTrace();
                        System.out.println("Entró en el bloque de error1");
                    }
            
                //en caso contrario entran consumidores
                
                System.out.println(Thread.currentThread().getName() + " esta comiendo manzananas");
                manzanas_comidas=0;
                cantidad_manzanas--;
                for(int i = 1; i < lleno; i++) {
                    if (manzanas_comidas<lleno) {
                        manzanas_comidas++;
                        comedor.manzana_comida();
                    }
                }
                contador_comedores--;
                try {
                notify();
                }catch(Exception e) {
                    e.printStackTrace();
                    System.out.println("Entró en el bloque de error2");
                }
            }
        }
        //fin sincronizado
    public CestaManzanas() {
        super();
    }
}//fin clase CestaManzanas

No sé porqué el método manzana_comida() no sabe a donde apunta, no encuentro el error.

  package Hilos_Juanfran;

public class ComedorManzanas implements Runnable {

    private int id;
    private int manzanas_comidas;
    private CestaManzanas cesta;
    private int manzanaxhilo=0;
    
    //constructores
    public ComedorManzanas() {
        super();
    }
    public int getManzanaxhilo() {
        return manzanaxhilo;
    }
    public void setManzanaxhilo(int manzanaxhilo) {
        this.manzanaxhilo = manzanaxhilo;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public int getManzanas_comidas() {
        return manzanas_comidas;
    }
    public void setManzanas_comidas(int manzanas_comidas) {
        this.manzanas_comidas = manzanas_comidas;
    }
    public ComedorManzanas(int id, int manzanas_comidas, CestaManzanas cesta) {
        super();
        this.id = id;
        this.manzanas_comidas = manzanas_comidas;
        this.cesta = cesta;
    }

    public ComedorManzanas(CestaManzanas cesta) {
        super();
        this.cesta = cesta;
    }
    
    public void manzana_comida() {
        manzanaxhilo++;
    }

    @Override
    public void run() {
        cesta.entrar_cesta();
        System.out.println(Thread.currentThread().getName()+" ha comido: "+ manzanaxhilo+ getManzanaxhilo());
    }
}//fin clase ComedorManzanas
  • 1
    Si miras lo que imprime el NullPointerException, te pondrá la línea **EXACTA** en la que te da el error. Y todos los NPE tienen exactamente la misma causa... estás intentando llamar a un método en un objeto que todavía no has instanciado, ergo, es `null`, y `null` no tiene ningún método de tu objeto. – Benito-B Oct 23 '21 at 10:14

0 Answers0