Nie działa program – NullPointerException

0

Mam do was pytanie, dlaczego mój program nie działa? Mój błąd to Exception in thread "main" java.lang.NullPointerException at zawodnicy.Zawodnicy.main(Zawodnicy.java:24) Program włącza się, mam możliwość wyboru zawodnika, ale potem włącza się błąd.
Ale nie wiem dlaczego?
I czy da się jakoś ulepszyć ten program, bo wygląda słabo.
Zawodnicy.java

package zawodnicy;
 
import java.util.Scanner;
 
public class Zawodnicy {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
 
        int number;
        System.out.println("Wybierz zawodnika:");
        System.out.println("1. Raiden");
        System.out.println("2. Shao Kahn");
        System.out.println("3. Liu Kang");
        System.out.println("4. Shang Tsung");
        System.out.println("5. Quan Chi");
        System.out.println("6. Scorpion");
        System.out.println("7. Johnny Cage");
        System.out.println("8. Mileena");
        number = input.nextInt();
 
        switch (number) {
        case 1:
            System.out.println("Wybrałeś Raidena");
            Encyclopedia.raiden.printInfo();
            break;
        case 2:
            System.out.println("Wybrałeś Shao Kahna");
            Encyclopedia.shao_kahn.printInfo();
            break;
        case 3:
            System.out.println("Wybrałeś Liu Kanga");
            Encyclopedia.liu_kang.printInfo();
            break;
        case 4:
            System.out.println("Wybrałeś Shang Tsunga");
            Encyclopedia.shang_tsung.printInfo();
            break;
        case 5:
            System.out.println("Wybrałeś Quan Chi");
            Encyclopedia.quan_chi.printInfo();
            break;
        case 6:
            System.out.println("Wybrałeś Scorpion");
            Encyclopedia.scorpion.printInfo();
            break;
        case 7:
            System.out.println("Wybrałeś Johnny Cage");
            Encyclopedia.johnny_cage.printInfo();
            break;
        case 8:
            System.out.println("Wybrałeś Mileenę");
            Encyclopedia.mileena.printInfo();
            break;
        default:
            System.out.println("Witaj nieznany użytkowniku!");
        }
 
        input.close();
    }
}

Encyclopedia.java

package zawodnicy;
 
public class Encyclopedia {
        static Fighter raiden;
        static Fighter shao_kahn;
        static Fighter liu_kang;
        static Fighter shang_tsung;
        static Fighter quan_chi;
        static Fighter scorpion;
        static Fighter johnny_cage;
        static Fighter mileena;
    public static void main(String[] args){
            raiden = new Fighter("Raiden", "Królestwo Ziemi", "Raiden jest Bogiem Gromu i Obrońcą Królestwa Ziemskiego. Nieśmiertelność oraz wrodzona mądrość dała możliwość prowadzenia ziemskich śmiertelników w niekończącym sie boju z siłami ciemności. W momencie kiedy Shao Kahn cesarz Outworld, zapragnął podbić Królestwo Ziemskie, Raiden porozumiał się ze świątynią światła, która wierzyła, że do rozstrzygania sporów turniej jest lepszy niż wojna. Raiden przedstawił reguły i zasady organizacji turnieju starszym bogom, prosząc o danie szansy Królestwu Ziemskiemu. W ten sposób narodził się Turniej Mortal Kombat. Przez wiele pokoleń wojownicy obu światów zmagali się w walce, nie śniąc nawet że jeden ze światów mógłby zwyciężyć kolejnych 10 turniejów. Wówczas Imperator Zaświatów przysłał Shang Tsunga, wniósł on do Mortal Kombat czarną magie, oraz czterorękiego księcia Goro. Turniej stał się rozpaczliwą walką o ocalenie Królestwa Ziemskiego. Niestety dziewięć ostatnich porażek na korzyść Goro, rozmyły wiarę o ocalenie tej pięknej krainy jaką jest Ziemia. Zdeterminowany Raiden by zapobiec wizji jaką wysłał mu jego imiennik z przyszłości, próbuje zrobić wszystko by nie dopuścić do najgorszego. ",
                130, 120, 2500, 3000);
            shao_kahn = new Fighter("Shao Kahn", "Pozaświat", "Imperator i władca Zaświatów. Żądza władzy cesarza Shao Kahna równa się jedynie jego bezwzględności. Tysiące lat temu obalił Onagę znanego jako Dragon King, pierwotnego władcę Zaświatów i od tego czasu podbił wiele innych światów. Jednym z ostatnich do podbicia jest Królestwo Ziemskie. Turniej Mortal Kombat uniemożliwia przejęcie świata inwazją - wymaga bowiem 10 zwycięstw armii Imperatora w turnieju. Ziemia będzie pod władaniem Shao Kahna o ile jego czempioni, Shang Tsung oraz książę Goro nie zawiodą go. ",
                120, 130, 3000, 2500);
            liu_kang = new Fighter("Liu Kang", "Królestwo Ziemi", "Liu Kang został osierocony w bardzo młodym wieku, jest uduchowionym mnichem z klasztoru Shaolin. Prezentuje doskonałe zgranie wszystkich swoich umiejętności. Kang jest chyba najbardziej wszechstronnym zawodnikiem. Jego potencjał zauważył opiekun Królestwa Ziemskiego, Raiden widząc w nim przyszłego obrońcę ziemian w turnieju Mortal Kombat. Raiden wysłał młodego mnicha na szkolenie do mistrza Bo' Rai Cho. Po ciężkich treningach Liu Kang pokonał wszystkich przeciwników i zdobył wielki zaszczyt reprezentowania klasztoru Shaolin w turnieju Mortal Kombat. Następnie razem z Raiden'em wyruszyli ku przeznaczeniu na wyspę Shang Tsunga, gdzie zostanie rozegrany turniej Mortal Kombat. ",
                150, 100, 2300, 3200);
            shang_tsung = new Fighter("Shang Tsung", "Pozaświat", "Shang to zdradziecki czarnoksiężnik przywłaszczający dusze pokonanych wojowników. Był gospodarzem ostatnich dziewięciu turniejów Mortal Kombat w Królestwie Ziemskim. Jest wielce oddany dla swego pana Shao Kahna, cesarza Outworld. Shang pochodzi z Ziemi i niegdyś reprezentował Królestwo Ziemskie w Turnieju Mortal Kombat, lecz jego wielka chęć poznania czarnej magii zaprowadziła go do Zaświatów. To tam sprzymierzył się z Imperatorem Outworld i przyrzekł walczyć przy jego boku, za zagłębienie się w czarną magię. Sheng jest wielce oddany Shao Kahnowi wykonując jego polecenia. Jeżeli nie spełni misji jaką jest zdobycie Królestwa Ziemskiego, czeka go wielka kara z rąk cesarza",
                125, 125, 2750, 2750);
            quan_chi = new Fighter("Quan Chi", "Czeluść", "Netherealm przyniósł wiele podłych istot, lecz żadna nie mogła równać się z magiem Quan Chi. Wykorzystuje demony Netherealm, wskrzesza zmarłych wojowników, aby móc wykorzystać ich w swoich diabelskich planach. Na czele ich stoi Udręczany ninja Shirai Ryu przydomek Scorpion. Który jest jego osobistym assassinem. Quan Chi buduje właśnie z takich upiorów armie. Niewiadomo jeszcze do jakich nikczemnych planów chce ją wykorzystać. Kolejną tajemnica czarnoksiężnika jest udział w turnieju Mortal Kombat w którym wynik turnieju nic nie wniesie dla NetherRealm. Sytuacja ta prowadzi niektórych obserwatorów do rozważań nad obecnością maga w turnieju. ",
                110, 140, 2900, 2600);
            scorpion = new Fighter("Skorpion", "Królestwo Ziemi, Czeluść", "Hanzo Hasashi był niegdyś członkiem japońskiego klanu ninja Shirai Ryu. Przybrał imię Scorpion ze względu na swoją szybką, zabójczą umiejętność walk. Jego życie było obdarzone wspaniałą walką w imię jego Wielkiego Mistrza. Lecz gdy jego rodzina oraz klan został brutalnie wyrżnięty przez Sub-Zero i członków Lin Kuei, bytowanie Scorpiona stało się wieczną torturą. Wskrzeszony przez złowrogiego czarnoksiężnika Quan Chi, przystąpił do turnieju Mortal Kombat, by pomścić swoich bliskich zabitych przez Sub-Zero.",
                140, 110, 2600, 2900);
            johnny_cage = new Fighter("Johnny Cage", "Królestwo Ziemi", "Nie ma większej gwiazdy sztuk walki niż Johnny Cage. Filmy takie jak Dragon Fist, Time Smashers, Citizen Cage uczyniły z niego jednego z najbardziej opłacanych aktorów w Hollywood. Ale w Johnnym jest coś więcej, coś czego sam nie wie. Cage jest potomkiem starożytnego śródziemnomorskiego kultu Morza, z którego wywodzili się wojownicy dla starszych bogów. Posiadali moce wykraczające poza możliwości śmiertelników. Cage odziedziczył niektóre z tych umiejętności, które pomogły mu zostać gwiazdą filmową, próżnym aktorem zapatrzonym w siebie. To pomoże mu w nadchodzącej bitwie.",
                115, 135, 2800, 2700);
            mileena = new Fighter("Mileena", "Pozaświat", "Shang Tsung stworzył wiele obrzydliwych stworów, w grotach z ciałami (Pits Flesh), ale nigdy kogoś tak pozbawionego uczuć jak Mileena. Połączenie Edeńskiego ciała i Tarkatańskiej krwi czyni ją piękną i bestią, dwoistość jej osobowości czyni ją niezróważoną psychicznie, jest podatna na ataki dzikości i okrucieństwa. Pomimo pięknego wyglądu kobiety, w duszy jest dzieckiem. Wiernie podporządkowana swemu panu. Pozbawiona sumienia i współczucia. Zabije każdego by tylko zadowolić swego ojca. ",
                160, 90, 2750, 2750);
 
        raiden.printInfo();
        shao_kahn.printInfo();
        liu_kang.printInfo();
        shang_tsung.printInfo();
        quan_chi.printInfo();
        scorpion.printInfo();
        johnny_cage.printInfo();
        mileena.printInfo();
 
    }
}

Fighter.java

package zawodnicy;
 
public class Fighter {
    private String name;
    private String realm;
    private String description;
    private int attack;
    private int defence;
    private int hp;
    private int power;
 
     public String getName() {
            return name;
        }
 
     public void setName(String name) {
            this.name = name;
        }
 
        public String getRealm() {
            return realm;
        }
 
        public void setRealm(String realm) {
            this.realm = realm;
        }
 
        public String getDescription() {
            return description;
        }
 
        public void setDescription(String description) {
            this.description = description;
        }
 
        public int getAttack() {
            return attack;
        }
 
        public void setAttack(int attack) {
            this.attack = attack;
        }
 
        public int getDefence() {
            return defence;
        }
 
        public void setDefence(int defence) {
            this.defence = defence;
        }
 
        public int getHp() {
            return hp;
        }
 
        public void setHp(int hp) {
            this.hp = hp;
        }
 
        public int getPower() {
            return power;
        }
 
        public void setPower(int power) {
            this.power = power;
        }
 
     Fighter(String name, String realm, String description, int attack, int defence, int hp, int power) {
            this.name = name;
            this.realm = realm;
            this.attack = attack;
            this.defence = defence;
            this.description = description;
            this.hp = hp;
            this.power = power;
        }
 
        void printInfo() {
            System.out.println("Nazwa wojownika: " + name);
            System.out.println("Kraina, którą reprezentuje: " + realm);
            System.out.println("Opis: " + description);
            System.out.println("Atak: " + attack);
            System.out.println("Obrona: " + defence);
            System.out.println("Punkty Życia: " + hp);
            System.out.println("Punkty Mocy: " + power);;
        }
}
1

Nigdy nie wykonujesz metody Encyclopedia::main.
To, że nazwałeś ją tak samo jak main w głównej klasie, wcale nie oznacza, że uruchomi się ona automatycznie.

1

Wywal te main z Encyclopedia, to co jest w main daj do domyślnego konstruktora, a w klasie Zawodnicy stwórz obiekt encyclopedia i na nim wywołuj te metody.

Może nie jest zbyt eleganckie rozwiązanie, ale powinno działać.

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