problem z Exception in thread "main" java.lang.NullPointerException

0

Witam, robie zadanie z programowania dotyczace listy zamowien, przy włączeniu pojawia mi się to:

Chleb; 3,50 zł; 1 szt; 3,50 zł
Cukier; 4,00 zł; 3 szt; 12,00 złException in thread "main" java.lang.NullPointerException
at Zamowienie.dodajPozycje(Zamowienie.java:15)
at Main.main(Main.java:11)

Process finished with exit code 1

Nie wiem już jaka jest tego przyczyna próbuje i nie mogę tego rozkminić. Wstawiam kod:

public class Pozycja {

    private String nazwaTowaru;
    private int ileSztuk;
    private double cena;

    Pozycja(String nazwaTowaru, int ileSztuk, double cena){
        this.nazwaTowaru = nazwaTowaru;
        this.ileSztuk = ileSztuk;
        this.cena = cena;
    }
    Pozycja(Pozycja p){
        this.nazwaTowaru = p.nazwaTowaru;
        this.ileSztuk = p.ileSztuk;
        this.cena = p.cena;
    }
    public String getNazwaTowaru(){
        return this.nazwaTowaru;
    }

    public double obliczWartosc(){
        return this.ileSztuk*this.cena;
    }

    public String toString(){
        return nazwaTowaru + "; " + String.format("%.2f",cena) + " zł; " + ileSztuk + " szt; " +
                String.format("%.2f",obliczWartosc()) + " zł";
    }

}

public class Zamowienie {
    public Pozycja[] pozycje;
    private int ileDodanych;
    private int maksRozmiar;

    Zamowienie(){
    this.maksRozmiar=10;
    this.ileDodanych=0;
    this.pozycje = new Pozycja[this.maksRozmiar];
    }
    Zamowienie(int maksRozmiar){
        this.maksRozmiar=maksRozmiar;
    }
    public void dodajPozycje(Pozycja p) {
        if(this.pozycje.length <= maksRozmiar){
            this.pozycje[ileDodanych] = new Pozycja(p);
            ileDodanych++;
        }
    }
    double obliczWartosc(){
        double lacznie=0.0;
        for(int i=0;i<ileDodanych;i++){
            lacznie+=pozycje[i].obliczWartosc();
        }
        return lacznie;
    }

    public String toString(){
        String napis = "\nZamówienie\n";
        for (int i=0; i<ileDodanych; i++){
            napis+=(pozycje[i].toString()+"\n");
        }
        napis+="Razem: " +String.format("%.2f",obliczWartosc()+" zł");
        return napis;
    }

}

public class Main{
    public static void main(String [] args) {
        Pozycja p1 = new Pozycja("Chleb", 1, 3.5);
        System.out.println(p1);
        Pozycja p2 = new Pozycja("Cukier", 3, 4);
        System.out.print(p2);
        Zamowienie z = new Zamowienie(10);
        z.dodajPozycje(p1);
        z.dodajPozycje(p2);
        System.out.println(z);

    }
}

Z góry wielkie dzięki!

2

Zdefiniowałeś dwa konstruktory, jeden z parametrem, drugi bez:

    Zamowienie(){
    this.maksRozmiar=10;
    this.ileDodanych=0;
    this.pozycje = new Pozycja[this.maksRozmiar];
    }
    Zamowienie(int maksRozmiar){
        this.maksRozmiar=maksRozmiar;
    }

Ten niesparametryzowany inicjalizuje wszystkie atrybuty jakimiś domyślnymi wartościami, ale ten który bierze parametr inicjalizuje tylko jeden - i przede wszystkim, tablicę pozycje pozostawia niezainicjalizowaną. Tego właśnie konstruktora użyłeś.

0
superdurszlak napisał(a):

Zdefiniowałeś dwa konstruktory, jeden z parametrem, drugi bez:

Ten niesparametryzowany inicjalizuje wszystkie atrybuty jakimiś domyślnymi wartościami, ale ten który bierze parametr inicjalizuje tylko jeden - i przede wszystkim, tablicę pozycje pozostawia niezainicjalizowaną. Tego właśnie konstruktora użyłeś.

Ok, próbowałem się pobawić, ale dalej nie działa. Nie wiem dalej co powinienem zrobić

0
this.pozycje = new Pozycja[this.maksRozmiar];

Dodaj to do Twojego konstruktora z parametrem.
Dodatkowo to Ci nie przejdzie (w klasie Zamowienie):

napis+="Razem: " +String.format("%.2f",obliczWartosc()+" zł");

Powinno być:

napis+="Razem: " +String.format("%.2f",obliczWartosc()) + "zł";

A najlepiej to by było użyć jakiegoś StringBuildera zamiast takiego łączenia stringów

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0