Avatar
tygrtom007
Člen
Avatar
tygrtom007:

Ahoj, potřebuji poradit s programem, asi to není nic závažného ale vyhazuje mi to pořád:
Exception in thread "main" java.lang.NullPo­interException
at randomtrygame­.Hrdina.utocNa(Hrdi­na.java:129)
at randomtrygame­.RandomTryGame­.main(RandomTry­Game.java:28)
Java Result: 1
Třída main:

package randomtrygame;

import java.util.Scanner;
public class RandomTryGame {


    public static void main(String[] args) {
       Kostka1 kostka64 = new Kostka1(64);
       Scanner sc = new Scanner(System.in, "Windows-1250");
       System.out.println("Vyber si hrdinu: Hrdina1 - 1, Hrdina2 - 2, Hrdina3 - 3.");
       Hrdina tvuj = new Hrdina (Integer.parseInt(sc.nextLine()));
       if (tvuj.vratZpravu().equals("Neplatná volba"))
           {
               System.out.println("Probléém.");
               System.exit(0);
           }
       System.out.println("Tvuj hrdina " + tvuj.vratZpravu());
       Hrdina nekdo3 = new Hrdina("Nepritel",80,30,30,10);
       System.out.println(tvuj.vypisHrdinu());
       System.out.println(nekdo3.vypisHrdinu());

       System.out.println(tvuj.utocNa(nekdo3));
}
}

A třída hrdiny

public class Hrdina {
        protected String Jmeno;
        protected int Zivoty;
        protected int maxZivoty;
        protected int utokMax;
        protected int utokMin;
        protected int Obrana;
        protected static Kostka1 kostka64;
        protected String Zprava;
        protected String Seznam;
        protected int Armor;
        protected int utokBez;
        protected int utokKrit;
        protected int Sance;
    public Hrdina(String jmeno, int zivot, int utok, int obrana, int krit)
    {
            this.Jmeno = jmeno;
            this.Zivoty = zivot;
            this.maxZivoty = zivot;
            this.utokMax = utok + 5;
            this.utokMin = utok;
            this.Obrana = obrana;
            this.kostka64 = kostka64;
            this.utokBez = 2;
            this.utokKrit = krit;
            Armor = 0;
            Seznam = String.format("%s má %d/%d HP. Utok: %d-%d, Obrana: %d. Brnění : %d. ",Jmeno,Zivoty,maxZivoty,utokMin,utokMax,Obrana,Armor);
    }
    public Hrdina(int volba)
    {
            if (volba == 1)
            {
                this.Jmeno = "Hrdina1";
                this.Zivoty = 60;
                this.maxZivoty = 60;
                this.utokMin = 35;
                this.utokMax = 40;
                this.Obrana = 35;
                this.kostka64 = kostka64;
                this.utokBez = 2;
                this.utokKrit = 10;
                Armor = 0;
                Seznam = String.format("%s má %d/%d HP. Utok: %d-%d, Obrana: %d. Brnění : %d. ",Jmeno,Zivoty,maxZivoty,utokMin,utokMax,Obrana,Armor);
            }
            if (volba == 2)
            {
                this.Jmeno = "Hrdina2";
                this.Zivoty = 100;
                this.maxZivoty = 100;
                this.utokMax = 30;
                this.utokMin = 25;
                this.Obrana = 25;
                this.kostka64 = kostka64;
                this.utokBez = 2;
                this.utokKrit = 10;
                Armor = 0;
                Seznam = String.format("%s má %d/%d HP. Utok: %d-%d, Obrana: %d. Brnění : %d. ",Jmeno,Zivoty,maxZivoty,utokMin,utokMax,Obrana,Armor);
            }
            if (volba == 3)
            {
                this.Jmeno = "Hrdina3";
                this.Zivoty = 80;
                this.maxZivoty = 80;
                this.utokMax = 35;
                this.utokMin = 30;
                this.Obrana = 30;
                this.kostka64 = kostka64;
                this.utokBez = 2;
                this.utokKrit = 10;
                Armor = 0;
                Seznam = String.format("%s má %d/%d HP. Utok: %d-%d, Obrana: %d. Brnění : %d. ",Jmeno,Zivoty,maxZivoty,utokMin,utokMax,Obrana,Armor);
            }
            if (volba == 1 || volba == 2 || volba == 3)
            {
                nastavZpravu(vypisHrdinu());
            }
            else //(volba != 1 || volba != 2 || volba != 3)
            {
                nastavZpravu("Neplatná volba");
            }
    }
    public boolean nazivu()
    {
            return Zivoty > 0;
    }
    @Override
    public String toString()
    {
            return Jmeno;
    }
    public void nastavZpravu(String zprava)
    {
            this.Zprava = zprava;
    }
    public String vratZpravu()
    {
            return Zprava;
    }
    public String nastavVratZpravu(String zprava)
    {
        this.Zprava = zprava;
        return Zprava;
    }
    public String vypisHrdinu()
    {
            return (Seznam + jeNazivu());
    }
    public String jeNazivu()
    {
        if (nazivu() == true)
        {
            return "Je naživu, zatím.";
        }
        else
        {
            return "Už je mrtvej.";
        }
    }
    public String utocNa(Hrdina souper)
    {
        int Uder = utokBez;
        Sance = 2;
        if (Sance == kostka64.hod(8)+1) //Sance == 1 || Sance == 2)
        {
            Uder = (kostka64.hodVlastni(utokMin, utokMax)) + (kostka64.hod(utokKrit));
        }
        else
        {
            Uder = kostka64.hodVlastni(utokMin, utokMax);
        }
            souper.branSe(Uder);
            return (String.format("%s útočí s úderem za %s hp", Jmeno, Uder));
    }
     private void branSe(int uder)
    {
        int zraneni = uder - ((Obrana + Armor)/3);
        if (zraneni > 0)
        {
                Zivoty -= zraneni;
                Zprava = String.format("%s utrpěl zranění %s hp", Jmeno, zraneni);
                if (Zivoty <= 0)
                {
                        Zivoty = 0;
                        Zprava += " a zemřel";
                }
        }
        else
        {
            Zprava = String.format("%s odrazil útok", Jmeno);
        }
        nastavZpravu(Zprava);
    }
    public String ukazZivoty(Hrdina hrdina)
    {
        return String.format("%s má %d/%d HP.", Jmeno, Zivoty, maxZivoty);
    }
}
 
Odpovědět 5.10.2014 16:43
Avatar
tomisoka
Redaktor
Avatar
tomisoka:

"kostka64" odkazuje na null

this.kostka64 = kostka64;

"this.kostka64" odkazuje na "kostku64" v objektu, "kostka64" odkazuje na "kostka64" v metodě - pokud existuje, jinak je to to samé jako "this.kostka64" (což je tvůj případ)

Editováno 5.10.2014 17:25
 
Nahoru Odpovědět 5.10.2014 17:22
Avatar
tygrtom007
Člen
Avatar
tygrtom007:

A jak se to dá vyřešit?

 
Nahoru Odpovědět 5.10.2014 17:44
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na tygrtom007
Jan Vargovský:

Vytvoř jí např. v statickém konstruktoru, nebo předej v konstruktoru jako všem ostatním, nebo si jí vytvoř v normálním konstruktoru.

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
 
Nahoru Odpovědět 5.10.2014 17:49
Avatar
tygrtom007
Člen
Avatar
Odpovídá na Jan Vargovský
tygrtom007:

Dík. Změnil jsem protected Kostka kostka64; na protected static Kostka kostka64; a funguje to. Moc jste mi pomohli. Už dva dny jsem si s tim nevěděl rady.

 
Nahoru Odpovědět 5.10.2014 18:18
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 5.