MudGuard: Methodenaufruf VOR Initialisierung ==> NullPointerException

Beitrag lesen

Hi,

heute hat mich Java mal wieder überrascht.
Bisher ging ich davon aus, daß die Initialisierung von member-Variablen geschieht, bevor eine Methode des Objekts aufgerufen werden kann.

Aber das scheint wohl doch nicht der Fall zu sein.

Ich hab eine Klasse RecordFilterGUI von JPanel abgeleitet, das unter anderem eine JTable (jTableFilterTable) enthält.
RecordFilterGUI enthält außerdem eine innere Klasse RecordFilterTableModel für das TableModel diese jTableFilterTable.
Diese innere Klasse enthält ein String-Array mColumnNames, das die Spaltennamen enthält - es wird direkt initialisiert. Die Initialisierung ist der einzige Schreibzugriff auf das Member mColumnNames.

Für die Initialisierung der Komponenten gibt es zwei Methoden (initComponents für die Sachen, die NetBeans per GUI-Editor macht sowie myInitComponents für meine zusätzlichen Dinge).
In myInitComponents setze ich das Model für jTableFilterTable - dazu erzeuge ich direkt im Aufruf ein neues RecordFilterTableModel.
Sollte ja kein Problem sein - dachte ich.

Aber:
es gibt eine NullPointerException in der Methode getColumnCount der Klasse RecordFilterTableModel.
Dort wird nur auf die Länge des String-Arrays zugegriffen, also kann nur dieses String-Array null sein.
Wie kann das sein?
Das Array wird doch mit new String[] { "..." } initialisiert. Und diese Initialisierung müßte doch geschehen, BEVOR getColumnCount aufgerufen werden kann.

Klar, ich kann das Problem umgehen, indem ich den den auskommentierten Code (Abfrage auf null) reinnehme.

Aber ich würde doch gerne wissen, ob das normal ist, daß Methoden aufgerufen werden können, bevor die Initialisierung des Objekts abgeschlossen ist.
Kann mir das jemand erklären?

Die Java-Version ist 1.4.2_05 von Sun (sowohl beim Übersetzen als auch beim Ausführen).

Hier noch der relevante Teil des Codes:

public class RecordFilterGUI extends javax.swing.JPanel
{
    public RecordFilterGUI()
    {
        initComponents();
        myInitComponents();
    }

private void myInitComponents()
    {
        jTableFilterTable.setModel(new RecordFilterTableModel());
    }

public class RecordFilterTableModel extends DefaultTableModel
    {
        private String [] mColumnNames = new String []
            {
                "Column", "Condition", "Value"
            };

public int getColumnCount()
        {
/*
            if (mColumnNames == null)
                return 0;
            else
 */
            return mColumnNames.length;         //<<<<<<<<<<<<<<<<<<<<<<<<<< hier gibt es ne NullPointerException
        }

//weitere Methoden für das TableModel
    }

//weitere Methoden von RecordFilterGUI
}

cu,
Andreas

--
Warum nennt sich Andreas hier MudGuard?
Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.