dispatchUncaughtException in Quiz Spiel mit GUI Layout

Jackii

Mitglied
Hallöchen alle,

ich habe da mal ein Problemchen, ich habe ein Quiz-Spiel geschrieben das ich gerne zum lernen für meine Fischerei Pfrüfung nutzen möchte. Ich habe eine grafische Benutzeroberfläche, die Frage, Antwort und Lösung habe ich durch splitten auseinander gelegt sodass ich es beim Fragen eingeben einfacher und übersichtiger habe.
Das Programm splittet auch schön alles auf, hab ich schon per Haltepunkte debuggt.

Problem ist jetzt ein Null.pointer mit dispatchUncaughtException
dies geschieht genau dann wenn die Frage in das Label geschrieben werden soll... ich bin etwas ratlos warum es jetzt auf einmal nicht mehr so klappt... vllt könnt ihr mir dabei bitte helfen.

Hier mal der Code(imports erspar ich euch):
Ich benutze Netbeans, Windows 7

Klasse Quiz_Fenster.java
Java:
public class Quiz_Fenster implements ActionListener {
   
    Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
   
    JLabel frage;
    JButton ant[] = new JButton[3];
   
    JFrame wl;
   
    int loesung = 0;

    public static void main(String[] args) {
        new frage_change();
        //new Quiz_Fenster();             //zum testen des Grundgeruest
    }
   
    public Quiz_Fenster() {
        wl = new JFrame();
        wl.setSize(800,400);    //breite, hoehe
        wl.setLocation((int) (dim.getWidth()-400)/2, (int) (dim.getHeight()-300 /2));
        wl.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        wl.setVisible(true);
        wl.setLayout(null);
       
        ant[0] = new JButton("  ");
        ant[0].setBounds(52, 120, 200, 40); //vom rand links,xx, lange,xx
        ant[0].addActionListener(this);
        wl.add(ant[0]);
       
        ant[1] = new JButton("  ");
        ant[1].setBounds(52, 190, 200, 40); //vom rand links,xx, lange,xx
        ant[1].addActionListener(this);
        wl.add(ant[1]);
       
        ant[2] = new JButton("  ");
        ant[2].setBounds(52, 260, 200, 40); //vom rand links,xx, lange,xx
        ant[2].addActionListener(this);
        wl.add(ant[2]);
       
        frage = new JLabel("Hier steht die Frage !");
        frage.setBounds(52, 15, 250, 40);
        wl.add(frage);
    }
   
    public void actionPerformed(ActionEvent e) {
        if(e.getSource() == ant[0]) {
            if(loesung == 1) {
                frage_change.neueFrage();
            } else {
                Nachricht("Falsch", "Versuche es später nochmal...");
            }
        }
        if(e.getSource() == ant[1]) {
            if(loesung == 2) {
                frage_change.neueFrage();
            } else {
                Nachricht("Falsch", "Versuche es später nochmal...");
            }
        }
        if(e.getSource() == ant[2]) {
            if(loesung == 3) {
                frage_change.neueFrage();
            } else {
                Nachricht("Falsch", "Versuche es später nochmal...");
            }
        }
    }
   
    public void ChangeButtonText(int button, String text) {
        ant[button -1].setText(text);
    }
   
    public void ChangeLabelText(String text) {
        frage.setText(text);                //macht er nicht                   
    }

   
    public void Nachricht(String Aussage, String info) {
        Object[] options = {"OK"};
        JOptionPane.showOptionDialog(null, Aussage, info, JOptionPane.DEFAULT_OPTION, JOptionPane.PLAIN_MESSAGE, null, options, options[0]);
    }
}

Klasse fragen_change.java
Java:
public class frage_change {
   
    static String ri_frage = null;
    static String op1 = null;        //Option 1
    static String op2 = null; 
    static String op3 = null; 

    static int loesung = 0;
   
    static Quiz_Fenster quiz;
    static Fragen fragen_klasse;
    static String akt_frage;
   
    public frage_change() {
        Quiz_Fenster quiz = new Quiz_Fenster();
        neueFrage();
    }
   
    public static void neueFrage() {
        fragen_klasse = new Fragen();
        akt_frage = fragen_klasse.frage;
       
        parser();
        aendereText();
    }
   
    public static void parser() {
        String[] frage = akt_frage.split("\\$");
       
        for(int x = 0; x < frage.length; x++) {
            switch(x) {
              
                case 0:
                    ri_frage = frage[x];
//                    System.out.println(ri_frage);
                    break;
               
                case 1:
                    op1 = frage[x];
//                    System.out.println(op1);
                    break;
                   
                case 2:
                    op2 = frage[x];
//                    System.out.println(op2);
                    break;
               
                case 3:
                    op3 = frage[x];
//                    System.out.println(op3);
                    break;
                   
                case 4:
                    loesung = Integer.parseInt(frage[x]);
//                    System.out.println("Was steht im case 4 in loesung");
//                    System.out.println(loesung);
                    break;
            }
        }
    }
   
    public static void aendereText() {
        System.out.println("Wie ist die Frage?");
        System.out.println(ri_frage);                              //hier gibt er das richtige aus
        quiz.ChangeLabelText(ri_frage);                         //hier schiesst er raus, ri_frage wird nicht richtig uebermittelt
//        System.out.println("Was steht jetzt in der Loesung?");
//        System.out.println(loesung);
        quiz.loesung = loesung;                                     //dann springt er hier raus
        quiz.ChangeButtonText(1, op1);                  
        quiz.ChangeButtonText(2, op2);                   
        quiz.ChangeButtonText(3, op3);                  
    }
}

und die Klasse Fragen.java
Java:
public class Fragen {
   
    int zufall;
    String fragen[] = new String[19];
    static String frage;
   
    public Fragen(){
        fragen[1] = "Welcher Fisch hat ein punkt? $Antowort A $Antwort B $Antwort C $1"; //Fragen können hier drunter gestellt werden
        fragen[2] = "Hecht? $Antowort A $Antwort B $Antwort C $2";
        fragen[3] = "Forelle? $Antowort A $Antwort B $Antwort C $3";
        fragen[4] = "Karpfen? $Antowort A $Antwort B $Antwort C $3";
        fragen[5] = "Zander? $Antowort A $Antwort B $Antwort C $3";
        fragen[6] = "Wels? $Antowort A $Antwort B $Antwort C $3";
       
        frage = fragen[zufall(1,7)];
    }
   
    public int zufall(int min, int max) {
        zufall = (int)((max-min)* Math.random()+ min);
        return zufall;
    }
}

hier ist noch die Fehlermeldung:
Exception in thread "main" java.lang.NullPointerException
at quiz.frage_change.aendereText(frage_change.java:74)
at quiz.frage_change.neueFrage(frage_change.java:31)
at quiz.frage_change.<init>(frage_change.java:23)
at quiz.Quiz_Fenster.main(Quiz_Fenster.java:28)

wenn ich es per Haltepunkte mache dann taucht das dispatchUncaughtException auf

Ich hoffe ihr könnt mir helfen und findet mein Fahler....
danke schonmal fürs anschauen 😉

LG Jackii
 
Die Exception fliegt in der Klasse frage_change in Zeile 74. Das Problem hier ist, dass dein Feld quiz null ist, weil du es nie initialisierst.
Im Konstruktor erstellst du eine gleichnamige, lokale Variable anstatt die Membervariable zu initialisieren.

Off-Topic: Vermeide static und nutzte sinnige/sprechende Zugriffsmodifier (hier private)
 
‍♀️ ja die Antwort kann so leicht sein... hab es voll übersehen das der oben null ist.
Danke für deine schnelle Antwort 😉

habs jetzt doppelt aber das krieg ich hin
 
bisher habe ich alle Probleme gelöst..

das mit dem doppelten Fenster war einfach nur weil ich das Fenster erstellen 2x aufgerufen habe (falls jemand sowas nach programmiert)

jetzt hätte ich nur die Frage wie ich am einfachsten keine dopplung ausgebe, ich könnt alle gestellten Fragen in eine Liste speichern und vorher vergleichen aber ich da echt etwas raus...OPs tun dem Kopf nicht gut xD

Java von Kopf bis Fuß hilft auch nicht grade.... habe über 200 Fragen die ich einbinden will, nur der Split bis zum a), b), c) klappt nicht so wie ich das gerne hätte...
 

Zurück
Oben