# dispatchUncaughtException in Quiz Spiel mit GUI Layout



## Jackii (1. Okt 2018)

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

```
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

```
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

```
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


----------



## Robat (1. Okt 2018)

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)


----------



## Jackii (2. Okt 2018)

‍♀️ 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


----------



## Jackii (2. Okt 2018)

danke


----------



## Jackii (3. Okt 2018)

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...


----------



## emlyn (3. Okt 2018)

lokale Variable anstatt die Membervariable zu initialisieren.


----------



## Jackii (4. Okt 2018)

emlyn hat gesagt.:


> lokale Variable anstatt die Membervariable zu initialisieren.


das pack ich dann in der Klasse fragen rein, pack ich das am besten vor oder nach dem Zufall rein?


----------

