Interpreter-Fehler Nullpointerexception trotz Ordentlicher Initialisierung

Mino1337

Mitglied
Hallo,

Ich habe einen JTree erstellt in einer eigenen Klasse, dieser soll in meinem Hauptframe "MasterFrame" in das Object "master" eingesetzt werden.

In der JTree-Klasse "Verzeichnissstruktur" wird mir beim übergeben jedoch eine NullPointerException beim ausführen angezeigt.

Der übergebene JTree ist jedoch vorher Ordentlich Initialisiert worden und kann keine null-referenz übergeben.

Hier der Fehlercode:

Exception in thread "main" java.lang.NullPointerException
at Benutzeroberfläche.Verzeichnisstruktur.<init>(Verzeichnisstruktur.java:43)
at Benutzeroberfläche.MasterFrame.<init>(MasterFrame.java:106)
at Benutzeroberfläche.MasterFrame.main(MasterFrame.java:54)

Hier die beiden betreffenden Klassen.

Java:
package Benutzeroberfläche;

import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.ScrollPaneConstants;

import Funktionalität.Eintrag;
import Funktionalität.Verzeichnis;

public class MasterFrame implements ActionListener {

    public static MasterFrame master;
   
    private JPanel a;
    private JScrollPane b;
    private JScrollPane c;
    private JPanel d;
   
    private JPanel bb;

    private JPanel cc;
   
    private GridBagLayout layout;
    private GridBagLayout eintraglayout;
    private FlowLayout aLayout;
    private JFrame f;
   
    private Verzeichnisstruktur baum;
   
    private JMenuBar menuBar;
   
    private JButton sammlungenausblenden;
    private JButton sammlungeneinblenden;
    private JButton neuesammlung;
   
    public static void main(String[] args){
        master = new MasterFrame();
    }

    public MasterFrame(){
       
        a = new JPanel();
        aLayout = new FlowLayout(FlowLayout.LEFT,5,5);
        a.setLayout(aLayout);
        bb = new JPanel();
        b = new JScrollPane(bb,ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        cc = new JPanel();
        eintraglayout = new GridBagLayout();
        cc.setLayout(eintraglayout);
        c = new JScrollPane(cc,ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        d = new JPanel();
       
        a.setBackground(Color.red);
        bb.setBackground(Color.yellow);
        cc.setBackground(Color.blue);
        d.setBackground(Color.white);
           
        f = new JFrame("Sammelfuchs");
        f.setMinimumSize(new Dimension(800, 600));
        f.setLocationRelativeTo(null);
        f.setVisible(true);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        layout = new GridBagLayout();
        f.setLayout(layout);
        setLayout(0);
       
        menuBar = new JMenuBar();
        makeMenu();
        f.setJMenuBar( menuBar );
       
        f.add(a);
        f.add(c);
        f.add(d);
       
        sammlungenausblenden = new JButton( "Sammlungen ausblenden" );
        sammlungenausblenden.setActionCommand("sammlungenausblenden");
        sammlungenausblenden.addActionListener(this);
       
        sammlungeneinblenden = new JButton( "Sammlungen einblenden" );
        sammlungeneinblenden.setActionCommand("sammlungeneinblenden");
        sammlungeneinblenden.addActionListener(this);
       
        neuesammlung = new JButton( "Neue Sammlung" );
        neuesammlung.setActionCommand("neuesammlung");
        neuesammlung.addActionListener(this);
       
        buttons(0);   
       
        baum = new Verzeichnisstruktur();
       
        f.validate();
    }
   
    public static void setConstraints(Component a,GridBagLayout c,int gridx, int gridy, int gridwith, int gridheight,int ipadx,int ipady, double weightx, double weighty, int fill, int anchor){
        GridBagConstraints cons = new GridBagConstraints();     //Bereinigung der Constrains (Alles auf Null setzen weil neu)
        cons.gridx = gridx;                 //In welcher Spalte startet das Objekt
        cons.gridy = gridy;                 //in welcher Zeile endet das Objekt
        cons.gridwidth = gridwith;            //Wieviele Spalten nimmt das Objekt ein
        cons.gridheight = gridheight;         //Wieviele Zeilen nimmt das Objekt ein
        cons.ipadx = ipadx;                 //Wie Breit ist das Objekt Mindestens
        cons.ipady = ipady;                 //Wie Hoch ist das Objekt Mindestens
        cons.weightx = weightx;             //Prozentualer Wert der Breite
        cons.weighty = weighty;             //Prozentualer Wert der Höhe
       
        cons.fill = fill;
        cons.anchor = anchor;
       
        c.setConstraints(a,cons);
    }
   
    public void setLayout(int x){
        if(x==0){
            setConstraints(a,layout,0,0,2,1,1,0,0.0,0.0,GridBagConstraints.BOTH,GridBagConstraints.CENTER);
            setConstraints(b,layout,0,1,1,1,200,0,0.0,1.0,GridBagConstraints.BOTH,GridBagConstraints.CENTER);
            setConstraints(c,layout,1,1,1,1,1,1,1.0,0.1,GridBagConstraints.BOTH,GridBagConstraints.CENTER);
            setConstraints(d,layout,0,3,2,1,1,20,1.0,0.0,GridBagConstraints.BOTH,GridBagConstraints.CENTER);
            f.add(b);
            f.validate();
            f.repaint();
        }else if(x==1){
            f.remove(b);
            f.validate();
            f.repaint();

        }
    }
   
    public void makeMenu() {
       
        JMenu neu = new JMenu( "Neu" );
        menuBar.add( neu );
        neu.add(new JMenuItem("Sammlung"));
        neu.add(new JMenuItem("Eintrag"));
       
        JMenu ansicht = new JMenu( "Ansicht" );
        menuBar.add( ansicht );
        ansicht.add(new JCheckBoxMenuItem("Sammlungen einblenden"));
       
        JMenu hilfe = new JMenu( "Hilfe" );
        menuBar.add( hilfe );
       
        JMenu ueber = new JMenu( "Über" );
        menuBar.add( ueber );
   
}
   
    public void buttons(int x){
        if(x==0){
            a.removeAll();
            a.add(sammlungenausblenden);
            a.add(neuesammlung);
            a.validate();
            f.repaint();
        }else if(x==1){
            a.removeAll();
            a.add(sammlungeneinblenden);
            a.add(neuesammlung);
            a.validate();
            f.repaint();
        }
    }
   
    public void actionPerformed(ActionEvent e) {
        if(e.getActionCommand().equals("sammlungeneinblenden")){
            buttons(0);
            setLayout(0);
        }else if(e.getActionCommand().equals("sammlungenausblenden")){
            buttons(1);
            setLayout(1);
        }else if(e.getActionCommand().equals("neuesammlung")){
            new Dialoge(f,"neueSammlung");
        }

    }
   
    public void addTree(JTree tree) {
        bb.add(tree);
    }
   
    public JFrame getF() {
        return f;
    }
   
    public void setUserObjektLayout(Verzeichnis a){
        cc.removeAll();
       
        JLabel name = new JLabel(a.getName());
        setConstraints(name,eintraglayout,0,0,2,1,1,1,0.0,1.0,GridBagConstraints.BOTH,GridBagConstraints.CENTER);
        cc.add(name);
        f.validate();
        f.repaint();   
    }

    public void setUserObjektLayout(Eintrag a){
        cc.removeAll();
       
        JLabel name = new JLabel(a.getName());
        setConstraints(name,eintraglayout,0,0,2,1,1,1,0.0,0.0,GridBagConstraints.BOTH,GridBagConstraints.CENTER);
       
        cc.add(name);
        f.validate();
        f.repaint();   
    }

    public Verzeichnisstruktur getBaum() {
        return baum;
    }

}

Java:
package Benutzeroberfläche;

import java.awt.Dimension;

import javax.swing.JTree;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.DefaultTreeSelectionModel;
import javax.swing.tree.TreePath;

import Funktionalität.Eintrag;
import Funktionalität.Verzeichnis;

public class Verzeichnisstruktur implements TreeSelectionListener{

    private DefaultMutableTreeNode root;
    private DefaultTreeModel treemodel;
    private JTree tree;
    private DefaultTreeSelectionModel selectionTree;
    private static int sammlungZaehler = -1;
   
   
   
    public Verzeichnisstruktur(){
   
    root = new DefaultMutableTreeNode();
    treemodel = new DefaultTreeModel(root);
    tree = new JTree();
    tree.setModel(treemodel);
   
    tree.setMinimumSize( new Dimension() );
   
    selectionTree = new DefaultTreeSelectionModel();
    selectionTree.setSelectionMode(DefaultTreeSelectionModel.SINGLE_TREE_SELECTION);
    tree.setSelectionModel(selectionTree);
    tree.addTreeSelectionListener(this);
   
    TreePath path = new TreePath(root);
    tree.expandPath(path);
   
    MasterFrame.master.addTree(tree);
   
    MasterFrame.master.getF().validate();
    MasterFrame.master.getF().repaint();
    }
   
    public void verzeichnis(String a){
       
       
        DefaultMutableTreeNode verzeichnis = new DefaultMutableTreeNode();
        verzeichnis.setUserObject(new Verzeichnis(a));
        Verzeichnisstruktur.sammlungZaehler = Verzeichnisstruktur.sammlungZaehler +1;

       
        /*sammlungZaehler = sammlungZaehler + 1;
        DefaultMutableTreeNode x = new DefaultMutableTreeNode();
        x.setUserObject(new Eintrag(a));
        treemodel.insertNodeInto(x, root, sammlungZaehler); */
    }
   
    public void valueChanged(TreeSelectionEvent e){
       
        TreePath tp = tree.getSelectionPath();
        DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode)tp.getLastPathComponent();
        Object userObject = selectedNode.getUserObject();
       
        if(selectedNode.isLeaf() == true && selectedNode.getLevel() == 0){
           
            Verzeichnis b = (Verzeichnis)userObject;
            MasterFrame.master.setUserObjektLayout(b);
       
        }else if(selectedNode.isLeaf() == true){
       
            Eintrag a = (Eintrag)userObject;
        MasterFrame.master.setUserObjektLayout(a);
       
        }else if(selectedNode.isLeaf() == false){
           
            Verzeichnis b = (Verzeichnis)userObject;
            MasterFrame.master.setUserObjektLayout(b);
        }
       
    }

}

Für mich sieht es so aus als wenn er das master-Objekt nicht findet aber ich wüsste nicht wieso da es als allererstes initialisiert wird.

Vielen Dank =)
 
Hier die Methode bei der sie als erstes auftritt:

Java:
    public Verzeichnisstruktur(){
   
    root = new DefaultMutableTreeNode();
    treemodel = new DefaultTreeModel(root);
    tree = new JTree();
    tree.setModel(treemodel);
   
    tree.setMinimumSize( new Dimension() );
   
    selectionTree = new DefaultTreeSelectionModel();
    selectionTree.setSelectionMode(DefaultTreeSelectionModel.SINGLE_TREE_SELECTION);
    tree.setSelectionModel(selectionTree);
    tree.addTreeSelectionListener(this);
   
    TreePath path = new TreePath(root);
    tree.expandPath(path);
   
    MasterFrame.master.addTree(tree);      <------------
   
    MasterFrame.master.getF().validate();
    MasterFrame.master.getF().repaint();
    }
 
Das Problem ist das du im Konstruktor der Klasse Verzeichnisstruktur auf das Attribut "master" zugreifen willst. Zu diesem Zeitpunkt ist dieses Attribut aber einfach noch nicht gesetzt. (Es ist null -> daher auch eine NullPointerException)
Ursache: Das Attribut "master" wird zwar in der main-Methode initialisiert, aber während der Initialisierung willst du schon wieder darauf zugreifen.

Lösung: Im Konstruktor nur Parameter prüfen und Attribute setzen! Layout und weitere Initialisierungen am besten in eine eigene Methode auslagern und extra aufrufen (nicht vom Konstruktor aus!)
 
Ahhhh ... wenn man drüber nachdenkt ist es Logisch =) ... Jetzt versteh ich auch wie man die main vernünftig benutzt ... Hab mich schon gewundert wozu so viel in der main von anderen Programmen steht =) ...

THX
 

Zurück
Oben