Duda de NullPointerException, en ejercicio de semáforos

Tengo este problema de NullPointerException en JAVA y no sé en qué fallo, a ver si me pudierais echar una mano.

En la clase Montador, en la condición if (rodes.getRoda() >= 2 && xassis.getXassis() >= 1 && manillar.getManillar() >= 1), es donde aparece el error.

Es un ejercicio de "SEMÁFOROS" en el cual consiste en un taller mecánico, en los que hay 3 operarios (Ruedas, Manillar, Chasis) y un montador (Montador). El operario de las ruedas puede tener como mucho 10 ruedas, el operario de los manillares como mucho puede tener 10 manillares, y el operario del chasis puede tener 4.

El montador solo puede montar una motocicleta siempre y cuando disponga de 2 ruedas, 1 manillar y 1 chasis, y se les descontará a cada operario dicha cantidad, para que pueda ir construyendo cuando le toque.

Os pego el código que tengo para cada clase.

-------------------------------------------------- MAIN -----------------------------------------------------------

package taller;
import java.útil.concurrent.Semaphore;
public static void main(String[] args) {
Rodes operari1;
Xassis operari2;
Manillar operari3;
Muntador muntador;
Semaphore mutex, esperar, agafar;
mutex = new Semaphore(1);
esperar = new Semaphore(0);
agafar = new Semaphore(0);
operari1 = new Rodes(mutex, esperar, agafar);
operari2 = new Xassis(mutex, esperar, agafar);
operari3 = new Manillar(mutex, esperar, agafar);
muntador = new Muntador(mutex, esperar, agafar);
operari1.start();
operari2.start();
operari3.start();
muntador.start();
}
}

-------------------------------------------------- RUEDAS ------------------------------------------------------

package taller;
import java.útil.concurrent.Semaphore;
public class Rodes extends Thread {
Semaphore mutex, espera, agafar;
private Semaphore semáforo;
int roda = 0;
int MAXIM = 10;
public Rodes(Semaphore pmutex, Semaphore pespera, Semaphore pagafar) {
this.mutex = pmutex;
this.espera = pespera;
this.agafar = pagafar;
}
public int getRoda() {
return roda;
}
public void setRoda(int rodes) {
this.roda -= rodes;
}
@Override
public void run() {
try {
while (this.roda < MAXIM) {
mutex.acquire();
System.out.println("RODES: construeixo una roda!");
this.roda++;
mutex.release();
Thread.sleep(1000);
if (roda == MAXIM) { //Quan arriba al màxim es manté a l'espera.
System.out.println("RODES: Ja tinc "+MAXIM+" RODES, m'espero...");
espera.acquire();
}
}
System.out.println("Total de Rodes: " + roda);
} catch (InterruptedException e) {
System.out.println("No funciona el fil de Rodes!!!");
}
}
}

-------------------------------------------------- MANILLAR ----------------------------------------------------

package taller;
import java.útil.concurrent.Semaphore;
public class Manillar extends Thread {
Semaphore mutex, espera, agafar;
int MAXIM = 10;
private Semaphore semáforo;
int manillar = 0;
public Manillar(Semaphore pmutex, Semaphore pespera, Semaphore pagafar) {
this.mutex = pmutex;
this.espera = pespera;
this.agafar = pagafar;
}
public int getManillar() {
return manillar;
}
public void setManillar(int manillar) {
this.manillar -= manillar;
}
@Override
public void run() {
try {
while (this.manillar < MAXIM) {
mutex.acquire();
System.out.println("MANILLAR: construeixo un manillar");
this.manillar++;
mutex.release();
Thread.sleep(1500);
if (manillar == MAXIM) { //Quan arriba al màxim es manté a l'espera.
System.out.println("MANILLAR: Ja tinc "+MAXIM+" MANILLAR, m'espero...");
espera.acquire();
}
}
System.out.println("Total de manillars: " + manillar);
} catch (InterruptedException e) {
System.out.println("No funciona el fil de Manillar!!!");
}
}
}

-------------------------------------------------- CHASIS -------------------------------------------------------

package taller;
import java.útil.concurrent.Semaphore;
public class Xassis extends Thread {
Semaphore mutex, espera, agafar;
private Semaphore semáforo;
int xassis = 0;
int MAXIM=4;
public Xassis(Semaphore pmutex, Semaphore pespera, Semaphore pagafar) {
this.mutex = pmutex;
this.espera = pespera;
this.agafar = pagafar;
}
public int getXassis() {
return xassis;
}
public void setXassis(int xassis) {
this.xassis -= xassis;
}
@Override
public void run() {
try {
while (this.xassis < MAXIM) {
mutex.acquire();
System.out.println("XASSIS: construeixo un xassis");
this.xassis++;
mutex.release();
Thread.sleep(2100);
if (xassis == MAXIM) { //Quan arriba al màxim es manté a l'espera.
System.out.println("XASSIS: Ja tinc "+MAXIM+" xassis, m'espero...");
espera.acquire();
}
}
System.out.println("total de Xassis: " + xassis);
} catch (InterruptedException e) {
System.out.println("No funciona el fil del Xassis!!!");
}
}
}

-------------------------------------------------- MONTADOR -------------------------------------------------

package taller;
import java.útil.concurrent.Semaphore;
public class Muntador extends Thread {
Manillar manillar;
Xassis xassis;
Rodes rodes;
int motos = 0;
Semaphore mutex, espera, agafar;
public Muntador(Semaphore pmutex, Semaphore pespera, Semaphore pagafar) {
this.mutex = pmutex;
this.espera = pespera;
this.agafar = pagafar;
}
@Override
public void run() {
while (true) {
try {
mutex.acquire();
System.out.println("MUNTADOR: comprobant si n'hi ha peces suficients...");
Thread.sleep(800);
if (rodes.getRoda() >= 2 && xassis.getXassis() >= 1 && manillar.getManillar() >= 1) {
System.out.println("MUNTADOR: Puc montar una motocicleta!!");
rodes.setRoda(2); //Resto dues unitats al operari de les rodes.
xassis.setXassis(1); //Resto una unitat al operari del xassis.
manillar.setManillar(1); //Resto una unitat al operari del manillar.
motos++; //Incremento una unitat al contador de motocicletes.
System.out.println("Quantitat de motocicletes montades: " + motos);
espera.release();// Comunicio als operaris que poden continuar fabricant peces.
} else {
System.out.println("No cumpleix els requisits per construir una motocicleta, m'espero una estona.");
mutex.release();
}
mutex.release();
} catch (InterruptedException e) {
System.out.println("No funciona el fil del muntador!!!");
}
}
}
}

1 Respuesta

Respuesta
1

primero que nada ...

Oye me parece que te manda un nullpointerexception por que en la clase Muntador

creas los objetos Manillar manillar;
Xassis xassis;
Rodes rodes;

sin embargo no los inicializas ...

como por ejemplo cuando los usan en main si lo haces :

package taller;
import java.útil.concurrent.Semaphore;
public static void main(String[] args) {
Rodes operari1;
Xassis operari2;
Manillar operari3;
Muntador muntador;
Semaphore mutex, esperar, agafar;
mutex = new Semaphore(1);
esperar = new Semaphore(0);
agafar = new Semaphore(0);
operari1 = new Rodes(mutex, esperar, agafar);
operari2 = new Xassis(mutex, esperar, agafar);
operari3 = new Manillar(mutex, esperar, agafar);
muntador = new Muntador(mutex, esperar, agafar);
operari1.start();
operari2.start();
operari3.start();
muntador.start();
}
}

Bueno bro espero te sirva no olvides calificar tu respuesta

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas