Błąd java.lang.NullPointerException

0

package Restauracja;

import java.util.ArrayList;
import java.util.Random;
import java.util.Timer;

/**
 *
 * @author LoL1
 */
public class Restaurant {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws InterruptedException {
        // TODO code application logic here
        int ile_klientów=50;
        int co_ile_przychodza=5000;
        int z_jakim_odchyleniem=3000;
        Random los = null;
        Klient konkret;
        Thread watek;
        Obsluga obsluga=new Obsluga(10, 20, 5, 4, 3, 8);
        ArrayList<Klient> klient = new ArrayList<>();
        Timer timer;
        
        
        for(int i=0; i<ile_klientów;i++){
            klient.add(new Klient(i, 5, 5, 3, obsluga, 1000));
        }
        for(int i=0;i<ile_klientów;i++){
           konkret=klient.get(i);
           konkret.start();
            Thread.sleep((int)(los.nextGaussian()*z_jakim_odchyleniem+co_ile_przychodza));
        }
       
    }
}


===========================================================================

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Restauracja;

import java.util.Random;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author LoL1
 */
public class Klient extends Thread{
    private int doStolika;
    private int bazowyCzasJedzenia;
    private int odchylenieCzasuJedzenia;
    private Obsluga obsluga;
    private int parametrCzasu;
    private Random los;
    private int id;
    
    Klient(int id, int doStolika, int bazowyCzasJedzenia, int odchylenieCzasuJedzenia, Obsluga obsluga, int parametrCzasu){
        this.doStolika=doStolika;
        this.bazowyCzasJedzenia=bazowyCzasJedzenia;
        this.odchylenieCzasuJedzenia=odchylenieCzasuJedzenia;
        this.obsluga=obsluga;
        this.parametrCzasu=parametrCzasu;
        this.id=id;
    }
    
    private int jem(){
        return (int)(los.nextGaussian()*odchylenieCzasuJedzenia+bazowyCzasJedzenia);
    }
    
    @Override
    public void run() {
        if(obsluga.CzyStolikWolny()){
            System.out.println(id+": Ide do stolika");
            try {
                obsluga.ZajmijStolik();
                Thread.sleep(doStolika*parametrCzasu);
               if(Math.random()>0.5){
                   System.out.println(id+": Sprawdzam czu bufet wolny");
                   while(!obsluga.CzyBufetWolny()) wait();
                   System.out.println(id+": Zajmuje bufet");
                   Thread.sleep(obsluga.ZajmijBufet()*parametrCzasu);
                   obsluga.OpuscBufet();
                   notifyAll();
               }
               else{
                   System.out.println(id+": Sprawdzam czy kelner wolny");
                   while(!obsluga.CzyKelnerWolny()) wait();
                   System.out.println(id+": Zajmuje kelnera");
                   Thread.sleep(obsluga.ZajmijKelnera()*parametrCzasu);
                   System.out.println(id+": Jem");
                   Thread.sleep(jem()*parametrCzasu);
                   obsluga.OpuscKelnera();
                   notifyAll();
               }
            } catch (InterruptedException ex) {
                Logger.getLogger(Klient.class.getName()).log(Level.SEVERE, null, ex);
            }
            
        }
        else System.out.println(id+": Nie było wolnych stolików ide sobie.");
       
    }
    
}


===========================================================================

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Restauracja;

import java.util.Random;

/**
 *
 * @author LoL1
 */
public class Obsluga {
    private int ilosc_miejsc_bufet;
    private int ilosc_stolik;
    private int ilosc_kelner;
    private int czas_pierwszego_dania;
    private int czas_drugiego_dania;
    private int czas_bazowy_bufetu;
    private Random los;
    Obsluga(int ilosc_miejsc_bufet, int ilosc_stolik, int ilosc_kelner,int czas_bazowy_bufetu, int czas_pierwszego_dania, int czas_drugiego_dania){
        this.ilosc_miejsc_bufet=ilosc_miejsc_bufet;
        this.ilosc_stolik=ilosc_stolik;
        this.ilosc_kelner=ilosc_kelner;
        this.czas_bazowy_bufetu=czas_bazowy_bufetu;
        this.czas_pierwszego_dania=czas_pierwszego_dania;
        this.czas_drugiego_dania=czas_drugiego_dania;       
    }
    
    public boolean CzyStolikWolny(){
        boolean aha=false;
        if(ilosc_stolik>0) aha=true;
        return aha;               
    }
    public boolean CzyBufetWolny(){
        boolean aha=false;
        if(ilosc_miejsc_bufet>0) aha=true;
        return aha;               
    }
    
    public boolean CzyKelnerWolny(){
        boolean aha=false;
        if(ilosc_kelner>0) aha=true;
        return aha;               
    }
    
    public synchronized void ZajmijStolik(){
        ilosc_stolik--;
    }
    
    public synchronized void OpuscStolik(){
        ilosc_stolik++;
    }
    
    public synchronized int ZajmijBufet(){
        ilosc_miejsc_bufet--;
        return (int) (los.nextGaussian()*ilosc_miejsc_bufet+czas_bazowy_bufetu);
    }
    
    public synchronized void OpuscBufet(){
        ilosc_miejsc_bufet++;
    }
    
    public synchronized int ZajmijKelnera(){
        ilosc_kelner--;
        return czas_pierwszego_dania+czas_drugiego_dania;
    }
    
    public synchronized void OpuscKelnera(){
        ilosc_kelner++;
    }
    
}

Wywala mi takie coś:

0: Ide do stolika
Exception in thread "main" java.lang.NullPointerException
	at Restauracja.Restaurant.main(Restaurant.java:39)
0: Sprawdzam czy kelner wolny
0: Zajmuje kelnera
0: Jem
Exception in thread "Thread-0" java.lang.NullPointerException
	at Restauracja.Klient.jem(Klient.java:34)
	at Restauracja.Klient.run(Klient.java:58)
Java Result: 1
0

W przyszłości zaznaczaj w kodzie, w którym wierszu wystąpił błąd. Nie trzeba będzie liczyć.
Zmienną obiektową (Random los) nie starczy zadeklarować, trzeba ją jeszcze utworzyć

Random los = new Random();

Ten błąd masz w dwóch miejscach.
Jesteś pewien, że metoda nextGaussian() jest w tym zadaniu właściwa? Ona może zwrócić liczbę ujemną.

0

Tak, jestem pewien, bo ma być rozkład normalny z bazą A i odchyleniem B więc nextGaussian()*B+A.
Zaznaczyłem zmienną.
Miejsca błędu zaznaczone poniżej.

package Restauracja;

import java.util.ArrayList;
import java.util.Random;

/**
 *
 * @author LoL1
 */
public class Restaurant {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws InterruptedException {
        // TODO code application logic here
        int ile_klientów=50;
        int co_ile_przychodza=5000;
        int z_jakim_odchyleniem=3000;
        Random los = null;
        Klient konkret=new Klient();
        Obsluga obsluga=new Obsluga(10, 20, 5, 4, 3, 8);
        ArrayList<Klient> klient = new ArrayList<>();
        
        
        for(int i=0; i<ile_klientów;i++){
            klient.add(new Klient(i, 5, 5, 3, obsluga, 1000));
        }
        for(int i=0;i<ile_klientów;i++){
           konkret=klient.get(i);
           konkret.start();
           Thread.sleep((int)(los.nextGaussian()*z_jakim_odchyleniem+co_ile_przychodza));        <============================
        }
       
    }
}

===============================================

public class Klient extends Thread{
    private int doStolika;
    private int bazowyCzasJedzenia;
    private int odchylenieCzasuJedzenia;
    private Obsluga obsluga;
    private int parametrCzasu;
    private Random los= new Random();
    private int id;
    
    Klient(){
        
    }
    
    Klient(int id, int doStolika, int bazowyCzasJedzenia, int odchylenieCzasuJedzenia, Obsluga obsluga, int parametrCzasu){
        this.doStolika=doStolika;
        this.bazowyCzasJedzenia=bazowyCzasJedzenia;
        this.odchylenieCzasuJedzenia=odchylenieCzasuJedzenia;
        this.obsluga=obsluga;
        this.parametrCzasu=parametrCzasu;
        this.id=id;
    }
    
    private int jem(){
        return (int)(los.nextGaussian()*odchylenieCzasuJedzenia+bazowyCzasJedzenia);
    }
    
    @Override
    public void run() {
        if(obsluga.CzyStolikWolny()){
            System.out.println(id+": Ide do stolika");
            try {
                obsluga.ZajmijStolik();
                Thread.sleep(doStolika*parametrCzasu);
               if(Math.random()>0.5){
                   System.out.println(id+": Sprawdzam czu bufet wolny");
                   while(!obsluga.CzyBufetWolny()) wait();
                   System.out.println(id+": Zajmuje bufet");
                   Thread.sleep(obsluga.ZajmijBufet()*parametrCzasu);         <============================
                   obsluga.OpuscBufet();
                   notifyAll();
               }
               else{
                   System.out.println(id+": Sprawdzam czy kelner wolny");
                   while(!obsluga.CzyKelnerWolny()) wait();
                   System.out.println(id+": Zajmuje kelnera");
                   Thread.sleep(obsluga.ZajmijKelnera()*parametrCzasu);        <============================
                   System.out.println(id+": Jem");
                   Thread.sleep(jem()*parametrCzasu);
                   obsluga.OpuscKelnera();
                   notifyAll();
               }
            } catch (InterruptedException ex) {
                Logger.getLogger(Klient.class.getName()).log(Level.SEVERE, null, ex);
            }
            
        }
        else System.out.println(id+": Nie było wolnych stolików ide sobie.");
       
    }
    
}

====================================================================

public class Obsluga {
    private int ilosc_miejsc_bufet;
    private int ilosc_stolik;
    private int ilosc_kelner;
    private int czas_pierwszego_dania;
    private int czas_drugiego_dania;
    private int czas_bazowy_bufetu;
    private Random los = new Random();
    Obsluga(int ilosc_miejsc_bufet, int ilosc_stolik, int ilosc_kelner,int czas_bazowy_bufetu, int czas_pierwszego_dania, int czas_drugiego_dania){
        this.ilosc_miejsc_bufet=ilosc_miejsc_bufet;
        this.ilosc_stolik=ilosc_stolik;
        this.ilosc_kelner=ilosc_kelner;
        this.czas_bazowy_bufetu=czas_bazowy_bufetu;
        this.czas_pierwszego_dania=czas_pierwszego_dania;
        this.czas_drugiego_dania=czas_drugiego_dania;       
    }
    
    public boolean CzyStolikWolny(){
        boolean aha=false;
        if(ilosc_stolik>0) aha=true;
        return aha;               
    }
    public boolean CzyBufetWolny(){
        boolean aha=false;
        if(ilosc_miejsc_bufet>0) aha=true;
        return aha;               
    }
    
    public boolean CzyKelnerWolny(){
        boolean aha=false;
        if(ilosc_kelner>0) aha=true;
        return aha;               
    }
    
    public synchronized void ZajmijStolik(){
        ilosc_stolik--;
    }
    
    public synchronized void OpuscStolik(){
        ilosc_stolik++;
    }
    
    public synchronized int ZajmijBufet(){
        ilosc_miejsc_bufet--;
        return (int) (los.nextGaussian()*ilosc_miejsc_bufet+czas_bazowy_bufetu);
    }
    
    public synchronized void OpuscBufet(){
        ilosc_miejsc_bufet++;
    }
    
    public synchronized int ZajmijKelnera(){
        ilosc_kelner--;
        return czas_pierwszego_dania+czas_drugiego_dania;
    }
    
    public synchronized void OpuscKelnera(){
        ilosc_kelner++;
    }
    
}

Błędy jakie mi wywala

0: Ide do stolika
Exception in thread "main" java.lang.NullPointerException
	at Restauracja.Restaurant.main(Restaurant.java:36)
0: Sprawdzam czu bufet wolny
0: Zajmuje bufet
Exception in thread "Thread-1" java.lang.IllegalArgumentException: timeout value is negative
	at java.lang.Thread.sleep(Native Method)
	at Restauracja.Klient.run(Klient.java:52)
Java Result: 1
BUILD SUCCESSFUL (total time: 5 seconds)

I nie rozumiem dlaczego nie uruchamia kolejnych klientów.

0

Czy ty sobie robisz jaja?
Pierwszy null pointer wynika z tego że "los" jest nullem...,
Drugi błąd wynika z tego że "timeout value is negative". Czego tym zdaniu nie rozumiesz?

BTW: poważnie chcesz napisać program z wykorzystaniem współbieżności nie umiejąc podstaw języka w którym chcesz to napisać? o_O

0

Nie robie sobie jaj :)
Ślepy widocznie jestem :)
Działa już. Źle sobie nextGaussian ustawiłem.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.