Einfaches Programm mit 2dim array -> NullPointerException



  • Hallo,

    folgender code:

    import java.awt.*;
    import java.awt.event.*;
    
    class Fenster extends Frame
    {  Panel[][] P = null;
    
       Fenster()
       {  this.setTitle("4 Gewinnt");
          //this.setSize(500, 300);
          this.setBackground(new Color(200, 255, 255));
          this.setLayout(new GridLayout(6, 7));
    
          //Erstellung der Komponenten
          P = new Panel[6][];
          for(int i = 0; i < P.length; i++)
             P[i] = new Panel[7];
    
         //bestimmte Schriftart, Schriftstil, Schriftgröße
          Font f = new Font("Arial", 2, 36);
          for(int i = 0; i < P.length; i++) 
             for(int j = 0; j < P[i].length; j++)
        	    (P[i][j]).setFont(f); 
    
          //Hinzufügen der erzeugten Komponenten zum Fenster
          for(int i = 0; i < P.length; i++) 
              for(int j = 0; j < P[i].length; j++)
         	    this.add(P[i][j]);
    
          //Verknüpfung des "Ohres" mit dem Fenster für das Schliessen-Ereignis
          this.addWindowListener(new WinAppKlasse());
    
          //Anpassen der Fenstergröße an die Komponenten
          this.pack();
    
          //Fenster sichtbar machen
          this.setVisible(true); //alte Fassung: this.show();
       }
    
       //Klasse für das Schliessen des Fensters
       class WinAppKlasse extends WindowAdapter
       {  public void windowClosing(WindowEvent e)
          {  System.exit(0);
          }
    
       }
    
       public static void main(String[] args)
       {  new Fenster();
    
       }
    
    }
    

    Jetzt sagt mir der Compiler das es einen NullPointerException gibt.
    Aber wo sollte die sein?
    Bevor ich darauf zugreife habe ich dem array doch objekte zugewiesen!?

    Könnte mir da vielleicht einer einen tipp geben? Wäre super.

    Gruß



  • Ok,

    das fehlte dann wohl doch...

    for(int i = 0; i < P.length; i++) 
      for(int j = 0; j < P[i].length; j++)
        P[i][j] = new Panel();
    


  • Hi.

    Vorweg, ich glaube wenn man Fehler postet, sollte man auch die Fehlermeldung mit Anhängen. Da steht dann meistens sowas wie "caused by" und "at" dabei. Dann sieht man auch besser wo genau der Fehler passiert.

    So wie es aussieht hast du dein Problem bereits erkannt. Du kannst natürlich die Methode "setFont" eines Panels nur aufrufen, wenn du das Panel hast. Leider sind die Panels bei dir erst nach dem Aufruf der "setFont" Methode erzeugt worden 😉

    Ein weiteres Problem oder zuminderst ist es mir nicht ganz klar, ist die Sache mit den 6*7 Panels die du in das Frame reinschmeißt. Ich glaube die müssten in das GridLayout und nicht in das Frame. Alternativ brauchst du irgendwie eine Möglichkeit die Panels zu unterscheiden.

    ....
    for (int i=0; i<6*7;i++) {
      Font f = new Font(...);
      Panel p = new Panle();
      p.setFont(f);
      this.add(p);
    }
    ....
    

    Das sollte doch in etwa das gleiche sein wie du momentan machst. Das du die Panels vorher in einer Matrix speicherst ist schön, letztendlich gehen dir diese "Koordinaten" doch aber verloren?

    Bin aber selber noch Anfänger und kenne mich mit dem GUI Zeug nicht wirklich aus 🙄 also eventuell liege ich auch völlig falsch?



  • Hallo,

    ebenfalls Anfänger schrieb:

    Vorweg, ich glaube wenn man Fehler postet, sollte man auch die Fehlermeldung mit Anhängen. Da steht dann meistens sowas wie "caused by" und "at" dabei. Dann sieht man auch besser wo genau der Fehler passiert.

    Richtig, das sollte man.

    ebenfalls Anfänger schrieb:

    Leider sind die Panels bei dir erst nach dem Aufruf der "setFont" Methode erzeugt worden 😉

    Die Panels wurden nicht erzeugt, erst nach dem einfügen von dem Codeausschnitt aus meinem 2.post wurden diese erzeugt.
    mit dem this.add(P); werden die erzeugten Komponenten hinzugefügt.

    ebenfalls Anfänger schrieb:

    Ein weiteres Problem oder zuminderst ist es mir nicht ganz klar, ist die Sache mit den 6*7 Panels die du in das Frame reinschmeißt. Ich glaube die müssten in das GridLayout und nicht in das Frame. Alternativ brauchst du irgendwie eine Möglichkeit die Panels zu unterscheiden.

    ....
    for (int i=0; i<6*7;i++) {
      Font f = new Font(...);
      Panel p = new Panle();
      p.setFont(f);
      this.add(p);
    }
    ....
    

    Das sollte doch in etwa das gleiche sein wie du momentan machst. Das du die Panels vorher in einer Matrix speicherst ist schön, letztendlich gehen dir diese "Koordinaten" doch aber verloren?

    Dem Frame weiße ich mit this das GridLayout zu, und dann schmeiße ich die Komponenten dort hinein. Es funktioniert. 🙂
    Mit deinem CodeBeispiel hast du schon recht, nur kann ich diese doch dann nicht mehr einzeln ansprechen? Warum sollten mir die Koordinaten verloren gehen? Ich habe doch ein 2-dim array und kann dann auf die koords somit zugreifen... Oder was meinen die anderen?

    Gruß


Anmelden zum Antworten