0

please, I am dealing with this problem.

*Caused by: java.lang.NullPointerException
    at main.PanelBatohu.<init>(PanelBatohu.java:19)
    at main.Tajemny_ostrov_Adventura.start(Tajemny_ostrov_Adventura.java:79)*

and it refers to:

public PanelBatohu (Batoh batoh) {
        this.batoh = batoh;
        batoh.zaregistrujPozorovatele(this);
        init();
    }

and

    **panelBatohu = new PanelBatohu(hra.getBatoh());
    borderPane.setLeft(panelBatohu.getPanel());**

If I delete this last part, the program starts working, but with this part, it does not :(

Please, I do not know how to fix it, does anyone know?

Thank you in advance!

Best regards, John

2 Answers2

1

Probably the variable hra is not initialized. You haven't submitted all your code so I can't really help a lot.

  • The stacktrace would be different. If `hra` is null, execution would never enter the constructor. – k5_ Mar 28 '20 at 23:19
0

Thank you all. This is the whole code.

PanelBatohu:

package main;

import javafx.scene.control.Label;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.FlowPane;
import javafx.scene.layout.VBox;
import logika.Batoh;
import util.ObserverZmenyBatohu;


public class PanelBatohu implements ObserverZmenyBatohu {
    private VBox vBox;
    private FlowPane panelVeci;
    private Batoh batoh;

    public PanelBatohu (Batoh batoh) {
        this.batoh = batoh;
        batoh.zaregistrujPozorovatele(this);
        init();
    }

    private void init() {
        vBox = new VBox();
        vBox.setPrefWidth(100);
        panelVeci = new FlowPane();
        Label label = new Label("Panel batohu");
        vBox.getChildren().addAll(label, panelVeci);
        aktualizuj();
    }

    public VBox getPanel() {
        return vBox;
    }

    @Override
    public void aktualizuj() {
        panelVeci.getChildren().clear();
        String nazevObrazku;
        for (String jmenoVeci : batoh.getSeznamVeci().keySet()){
            nazevObrazku = "/zdroje/"+ jmenoVeci + ".png";
            ImageView vecImageView = new ImageView(new Image
                    (Tajemny_ostrov_Adventura.class.getResourceAsStream(nazevObrazku),
                            100, 100, false, false));
            panelVeci.getChildren().add(vecImageView);
        }
    }
}

and Tajemny_ostrov_Adventura (start class):

package main;

import javafx.application.Application;
import javafx.application.Platform;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.FlowPane;
import javafx.scene.paint.Paint;
import javafx.scene.shape.Circle;
import javafx.scene.text.Font;
import javafx.scene.text.FontWeight;
import javafx.stage.Stage;
import javafx.stage.WindowEvent;
import logika.Hra;
import logika.IHra;
import uiText.TextoveRozhrani;

import java.awt.*;

public class Tajemny_ostrov_Adventura extends Application {

    private BorderPane borderPane;
    private TextArea centerTextArea;
    private IHra hra;
    private FlowPane dolniFlowPane;
    private Label zadejPrikazLabel;
    private TextField prikazTextField;
    private OknoProstoru oknoProstoru;
    private PanelVychodu panelVychodu;
    private PanelBatohu panelBatohu;

    public static void main(String[] args) {
        if (args.length == 0) {
            launch(args);
        } else {
            if (args[0].equals("-text")) {
                IHra hra = new Hra();
                TextoveRozhrani ui = new TextoveRozhrani(hra);
                ui.hraj();
            } else {
                System.out.println("Neplatny parametr");
            }
        }

    }

    @Override
    public void start(Stage primaryStage) {
        primaryStage.setOnCloseRequest(new EventHandler<WindowEvent>() {
            @Override
            public void handle(WindowEvent e) {
                Platform.exit();
                System.exit(0);
            }
        });

        borderPane = new BorderPane();
        hra = new Hra();
        nastavTextArea();
        borderPane.setCenter(centerTextArea);
        nastavDolniPanel();
        borderPane.setBottom(dolniFlowPane);

        oknoProstoru = new OknoProstoru(hra.getHerniPlan());
        borderPane.setTop(oknoProstoru.getPanel());

        panelVychodu = new PanelVychodu(hra.getHerniPlan());
        borderPane.setRight(panelVychodu.getList());

        panelBatohu = new PanelBatohu(hra.getBatoh());
        borderPane.setLeft(panelBatohu.getPanel());

        Scene scene = new Scene(borderPane, 900, 650);
        primaryStage.setTitle("Tajemný ostrov");
        primaryStage.setScene(scene);
        prikazTextField.requestFocus();
        primaryStage.show();

    }

    private void nastavTextArea() {
        centerTextArea = new TextArea();
        centerTextArea.setText(hra.vratUvitani());
        centerTextArea.setEditable(false);
    }

    private void nastavDolniPanel () {
        dolniFlowPane = new FlowPane();
        zadejPrikazLabel = new Label("Zadej příkaz: ");
        zadejPrikazLabel.setFont(Font.font("TimesRoman", FontWeight.BOLD, 20));
        prikazTextField = new TextField();
        dolniFlowPane.setAlignment(Pos.CENTER);
        dolniFlowPane.getChildren().addAll (zadejPrikazLabel, prikazTextField );

        prikazTextField.setOnAction(new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent event) {
                String radek = prikazTextField.getText();
                String text = hra.zpracujPrikaz(radek);
                centerTextArea.appendText("\n" + radek + "\n");
                centerTextArea.appendText("\n" + text + "\n");
                prikazTextField.setText("");
                if (hra.konecHry()) {
                    prikazTextField.setEditable(false);

                }
        };

    });
}


}

Hra

package logika;

/**
 *  Třída Hra - třída představující logiku adventury.
 * 
 *  Toto je hlavní třída  logiky aplikace.  Tato třída vytváří instanci třídy HerniPlan, která inicializuje mistnosti hry
 *  a vytváří seznam platných příkazů a instance tříd provádějící jednotlivé příkazy.
 *  Vypisuje uvítací a ukončovací text hry.
 *  Také vyhodnocuje jednotlivé příkazy zadané uživatelem.
 *
 *@author     Michael Kolling, Lubos Pavlicek, Jarmila Pavlickova, Jan Novotný
 *@version    pro školní rok 2016/2017, ZS 2019/2020
 */

public class Hra implements IHra {
    private SeznamPrikazu platnePrikazy;    // obsahuje seznam přípustných příkazů
    private HerniPlan herniPlan;
    private boolean konecHry = false;
    private Batoh batoh;

    /**
     *  Vytváří hru a inicializuje místnosti (prostřednictvím třídy HerniPlan) a seznam platných příkazů.
     */
    public Hra() {
        herniPlan = new HerniPlan();
        batoh = new Batoh();
        platnePrikazy = new SeznamPrikazu();
        platnePrikazy.vlozPrikaz(new PrikazNapoveda(platnePrikazy));
        platnePrikazy.vlozPrikaz(new PrikazJdi(herniPlan));
        platnePrikazy.vlozPrikaz(new PrikazSeber(herniPlan));
        platnePrikazy.vlozPrikaz(new PrikazKonec(this));
        platnePrikazy.vlozPrikaz(new PrikazBatoh(herniPlan));
        platnePrikazy.vlozPrikaz(new PrikazZahod(herniPlan));
        platnePrikazy.vlozPrikaz(new PrikazOdemkni(herniPlan));
        platnePrikazy.vlozPrikaz(new PrikazVybojuj(herniPlan));
    }

    /**
     *  Vrátí úvodní zprávu pro hráče.
     */
    public String vratUvitani() {
        return "Vítejte!\n" +
        "Hraješ za dobrodruha Jindřicha, který se nachází ve své lodi,\n" +
        "kterou připlul na tajemný ostrov.\n" +
        "Tvým cílem je najít prababiččin poklad ukrytý v hoře.\n" +
        "Aby jsi poklad získal, musíš nejprve najít meč, který je schovaný v jeskyni.\n" +
        "Klíč k tajné schránce v jeskyni najdeš u lesní víly.\n" +
        "K získání pokladu musíš mečem otevřít bránu k pokladu\n" + 
        "a zabít místního strážce.\n" + 
        "Napište 'nápověda', pokud si nevíte rady, jak hrát dál.\n" +
        "\n" +
        herniPlan.getAktualniProstor().dlouhyPopis();
    }

     /**
     *  Vrátí závěrečnou zprávu pro hráče.
     */
    public String vratEpilog() {
        return "Dík, že jste si zahráli. Brzy se zase vraťte! Ahoj.";
    }

    /** 
     * Vrací true, pokud hra skončila.
     */
    public boolean konecHry() {
        return konecHry;
    }

    /**
     *  Metoda zpracuje řetězec uvedený jako parametr, rozdělí ho na slovo příkazu a další parametry.
     *  Pak otestuje zda příkaz je klíčovým slovem  např. jdi.
     *  Pokud ano spustí samotné provádění příkazu.
     *
     *@param  radek  text, který zadal uživatel jako příkaz do hry.
     *@return          vrací se řetězec, který se má vypsat na obrazovku
     */
    public String zpracujPrikaz(String radek) {
        String [] slova = radek.split("[ \t]+");
        String slovoPrikazu = slova[0];
        String []parametry = new String[slova.length-1];
        for(int i=0 ;i<parametry.length;i++){
            parametry[i]= slova[i+1];   
        }
        String textKVypsani=" .... ";
        if (platnePrikazy.jePlatnyPrikaz(slovoPrikazu)) {
            IPrikaz prikaz = platnePrikazy.vratPrikaz(slovoPrikazu);
            textKVypsani = prikaz.provedPrikaz(parametry);
            if (herniPlan.jeVyhra()){
                konecHry = true;
                textKVypsani += "\n + výhra!"; //\n je odřádkování
            }
        }
        else {
            textKVypsani="Nevím co tím myslíš? Tento příkaz neznám! ";
        }
        return textKVypsani;
    }

    /**
     *  Nastaví, že je konec hry, metodu využívá třída PrikazKonec,
     *  mohou ji použít i další implementace rozhraní Prikaz.
     *  
     *  @param  konecHry  hodnota false= konec hry, true = hra pokračuje
     */
    void setKonecHry(boolean konecHry) {
        this.konecHry = konecHry;
    }

    /**
     *  Metoda vrátí odkaz na herní plán, je využita hlavně v testech,
     *  kde se jejím prostřednictvím získává aktualní místnost hry.
     *  
     *  @return     odkaz na herní plán
     */
    public HerniPlan getHerniPlan(){
        return herniPlan;
    }


    /**
     *  Metoda vrátí odkaz na batoh.
     *
     *
     *  @return     odkaz na batoh
     */
    public Batoh getBatoh(){
        return batoh;
    }
  }