# WM-Quiz -java.lang.NullPointerException



## chwo (15. Jun 2014)

Hallo, ich habe ein einfaches WM-Quiz erstellt, bei dem die Fragen mit einem Parser zerlegt werden und dann der GUI zugewiesen werden. In der Theorie schön und gut und auch beim kompilieren gibt es keine Fehlermeldung. Wenn man das Programm allerdings ausführt, kommt folgender Error und die Fragen werden nicht in die GUI geladen:

```
Exception in thread "main" java.lang.NullPointerException
	at FrageChange.aendereText(FrageChange.java:69)
	at FrageChange.neueFrage(FrageChange.java:27)
	at FrageChange.<init>(FrageChange.java:18)
	at QuizFenster.main(QuizFenster.java:23)
```
Auf der Seite ( http://wiki.infostudium.de/wiki/Fehlermeldungen_(Java) ) habe ich folgende Beschreibung zum Fehler gefunden, jedoch komme ich damit auch nicht weiter 


```
Exception in thread "main" java.lang.NullPointerException
        at Test.main(Test.java:5)
```
Der Versuch auf eine Objektrefernz zu zugreifen, die den Wert null enthält. Die Referenz muss entweder mit einer anderen Referenz oder mit dem new-Operator initialisiert werden. Der Fehler kann auch im Zusammenhang mit Hüllklassen auftreten, dazu ein Beispiel:


```
public class Test {
    public static void main(String[] args) {
        Integer[] array = new Integer[5];
        int i = array[0];     // <-- hier tritt die Exception auf
        System.out.println(i);
    }
}
```
Arrays werden in Java standardmäßig mit 0 bzw. null initialisiert. Daher kommt beim Compilieren keine Meldung vom Typ "variable *** might not have been initialized". Wird dann versucht mit dem Integer-Objekt zu arbeiten tritt die Exception auf.

Anbei poste ich jetzt noch den Java-Code. Es wäre echt toll, wenn mir einer helfen kann und mich auf den Fehler aufmerksam macht 

QuizFenster.java

```
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

public class QuizFenster implements ActionListener {
  
  //Bildschirmgröße messen
  Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
  
  //GUI Objekte
  JLabel frage;
  JButton ant[] = new JButton[4];
  JFrame w1;
  JLabel counter;
  
  //Variablen
  int lösung, richtig;
  static int erg;
  
  //Hauptmethode
  public static void main(String args[]){
    new FrageChange();  
  }
  
  //GUI erstelen
  public QuizFenster(){
    w1 = new JFrame();
    w1.setSize(400,300);
    //Fenster in Bildschirmmite platzieren
    w1.setLocation((int) (dim.getWidth()-400)/2, (int) ((dim.getHeight()-300))/2);
    w1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    w1.setVisible(true);
    w1.setLayout(null);
    
    ant[0] = new JButton("   ");
    ant[0].setBounds(52,90,120,40);
    w1.add(ant[0]);
    ant[0].addActionListener(this);
    
    ant[1] = new JButton("   ");
    ant[1].setBounds(52,160,120,40);
    w1.add(ant[1]);
    ant[1].addActionListener(this);
    
    ant[2] = new JButton("   ");
    ant[2].setBounds(220,90,120,40);
    w1.add(ant[2]);
    ant[2].addActionListener(this);
    
    ant[3] = new JButton("   ");
    ant[3].setBounds(220,160,120,40);
    w1.add(ant[3]);
    ant[3].addActionListener(this);
    
    frage = new JLabel("Hier steht die Frage!");
    frage.setBounds(52,15,250,40);
    w1.add(frage);
    
    counter = new JLabel("Hier steht der Counter");
    counter.setBounds(120,220,140,25);
    w1.add(counter);
  }
  
  //Action Listener
  public void actionPerformed (ActionEvent e){
    if (e.getSource() == ant[0]){
      if (lösung == 1) {
        Nachricht("Richtig", "Weiter so!");
        add();
        Ende();
        FrageChange.neueFrage();
      } else {
        Nachricht("Falsch","Nicht so.");
        sub();
        FrageChange.neueFrage();
      } // end of if-else
    } // end of if
    
    if (e.getSource() == ant[1]){
      if (lösung == 2) {
        Nachricht("Richtig", "Weiter so!");
        add();
        Ende();
        FrageChange.neueFrage();
      } else {
        Nachricht("Falsch","Nicht so.");
        sub();
        FrageChange.neueFrage();
      } // end of if-else
    } // end of if
    
    if (e.getSource() == ant[2]){
      if (lösung == 3) {
        Nachricht("Richtig", "Weiter so!");
        add();
        Ende();
        FrageChange.neueFrage();
      } else {
        Nachricht("Falsch","Nicht so.");
        sub();
        FrageChange.neueFrage();
      } // end of if-else
    } // end of if
    
    if (e.getSource() == ant[3]){
      if (lösung == 4) {
        Nachricht("Richtig", "Weiter so!");
        add();
        Ende();
        FrageChange.neueFrage();
      } else {
        Nachricht("Falsch","Nicht so.");
        sub();
        FrageChange.neueFrage();
      } // end of if-else
    } // end of if
    
  }
  
  //schreibt Frage in die GUI
  public void ChangeButtonText(int button,String text){
    ant[button-1].setText(text);  
  }
  public void ChangeLabelText(String text){
    frage.setText(text);
  }
  public void ChangeCounter(String text){
    counter.setText(text);
  }  
  
  //angezeigte Nachricht
  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]);
  }
  
  //zählt die richtiigen Antworten
  public void Ende(){
    if (richtig <=11) {
      richtig+=1;
    } else {
      Nachricht("Super", "Herzlichen Glückwunsch !");
      System.exit(0);
    } // end of if-else
  }
  
  //steuuern den Counter
  public void add(){
    erg = erg+2;
    //return erg;
  }
  public void sub(){
    erg = erg-3;
    //return erg;
  }
}
```

Fragen.java

```
public class Fragen {
  
  //Variablen
  int zufall;
  String fragen[] = new String[19];
  static String frage;
  
  //Quiz-Fragen
  public Fragen(){
    fragen[1] = "Was ist die Hauptstadt von Brasilien?$São Paulo$Rio de Janeiro$Brasília$Porto Alegre$3";
    fragen[2] = "Welches Land war bisher als einziger Teilnehmer bei allen 18 ausgetragenen WM-Endrunden vertreten?$Brasilien$England$Italien$Deutschland$1";
    fragen[3] = "Bei welcher WM wurden Gelbe und Rote Karten eingeführt?$1958$1966$1970$1978$3";
    fragen[4] = "welches Land hat die meisten WM-Finals verloren?$Deutschland$Uruguay$Italien$England$1";
    fragen[5] = "Ein Hattrick ist schon eine Besonderheit, aber welchem Spieler gelangen in einer WM-Partie fünf Tore?$Oleg Salenko$Eusebio$Gustav Wetterström$Pélé$1";
    fragen[6] = "Welcher Spieler schoss das schnellste Tor der WM-Geschichte?$Michael Ballack$Hakan Sükür$Ebbe Sand$Lucien Laurent$2";
    fragen[7] = "Welches Team gewann alle Elfmeterschießen, zu denen es bei einer WM antreten musste?$Brasilien$Italien$Deutschland$England$3";
    fragen[8] = "Wer wurde in der Vorrunde vom Platz gestellt und traf doppelt im Finale?$Diego Maradona$Zinedine Zidane$Michel Platini$Lionel Messi$2";
    fragen[9] = "Welcher Trainer hat zwölf WM-Spiele in Folge gewonnen?$Franz Beckenbauer$Bora Milutinovic$Luiz Felipe Scolari$Berti Vogts$3";
    fragen[10]= "Wie lautet der Name des WM-Balls 2014?$Jabulani$Teamgeist$Telstar$Brazuca$4";
    //einige Fragen von: [url=http://www.spiegel.de/quiztool/quiztool-51703.html]Fußball-Quiz: Werden Sie WM-Weltmeister! - SPIEGEL ONLINE[/url]
    
    frage = fragen[zufall(1,11)];       
  }
  
  public int zufall(int min,int max){
    zufall =(int) ((max-min)*Math.random()+min);
    return zufall;
  }
  
}
```

FrageChange.java

```
class FrageChange{
  
  //Variablen
  static String riFrage = null;
  static String op1 = null;
  static String op2 = null;
  static String op3 = null;
  static String op4 = null;
  static int lösung = 0;
  static QuizFenster quiz;
  static Fragen fragenKlasse;
  static String aktFrage;
  static int erg =0;;
  
  //wird in Hauptmethode gestartet
  public FrageChange(){  
    QuizFenster quiz = new QuizFenster();
    neueFrage();    
  }
  
  //neue Frage
  public static void neueFrage(){
    fragenKlasse = new Fragen();
    aktFrage = Fragen.frage;
    
    parser();
    aendereText();
    updateCounter();
  }
  
  //zerlegt die Fragen in Frage,Optionen und Antwort
  public static void parser(){
    String[] frage = aktFrage.split("\\$");
    
    for (int x=0; x< frage.length; x++) {
      switch (x) {
        case 0:
        riFrage = frage[x]; 
        break;
        
        case 1: 
        op1 = frage[x];  
        break;
        
        case 2: 
        op2 = frage[x];  
        break;
        
        case 3: 
        op3 = frage[x];  
        break;
        
        case 4: 
        op4 = frage[x];  
        break;
        
        case 5: 
        lösung = Integer.parseInt(frage[x]);  
        break;
      } // end of switch
    } // end of for
    
    System.out.println(riFrage);   
  }
  
  //ändert den Text auf der GUI
  public static void aendereText(){
    System.out.println("test");
    quiz.ChangeLabelText(riFrage);
    System.out.println("test2");
    quiz.lösung = lösung;
    quiz.ChangeButtonText(1, op1);
    quiz.ChangeButtonText(2, op2);
    quiz.ChangeButtonText(3, op3);
    quiz.ChangeButtonText(4, op4);
  }
  
  public static void updateCounter(){
    quiz.ChangeCounter((String)"Du hasst"+erg+"von 20 Punkten");
  }    
}
```


----------



## stg (15. Jun 2014)

Du solltest dich dringend (!) damit vertraut machen, was das Schlüsselwort 
	
	
	
	





```
static
```
 genau bedeutet und wann man es setzen sollte und vorallem wann nicht. Nicht, dass du dir gleich von Beginn an Falsches angewöhnst...

In Zeile 10 führst du eine statische Variable quiz ein, auf die du dann in Zeile 69 zugreifen willst.
In Zeile 17 überschreibst du aber lokal diese Variable mit einer Variablen, die ebenfalls quiz heißt, aber nach Durchlauf des Konstruktors sofort wieder weggeworfen wird. Schreibst du an dieser Stelel statt

```
QuizFenster quiz = new QuizFenster();
```
lediglich

```
quiz = new QuizFenster();
```
so sollte dieser Fehler verschwunden sein.


----------

