Null-Pointer Exception beim Programmstart

Wuast

Bekanntes Mitglied
Hallo Leute,

ich drehe durch. Ich bekomme beim Programmstart eine Null-Pointer-Exception geworfen.
Das Problem ist eine Liste. Wenn ich diese nun
Java:
public class Beispielklasse {
List beispielListe =  new ArrayList();
    //Variablen & Methoden sind hier nicht weiter relevant
}
so deklariere und in der Main ein Objekt der beispielKlasse erzeuge, ist alles fein.

Wenn ich das aber über einen Konstruktor mache, dann ist die Liste null.
Code:
public class Beispielklasse {

    List beispielListe;
    
    public Beispielklasse(){
    beispielListe = new ArrayList();
    }

    // und sie ist auch null bei
    public Beispielklasse (BeispielObjekt objekt){
    beispielListe = new ArrayList();
    beispielListe.add(objekt);
    }
    //weil ich beim Programmstart noch kein BeispielObjekt habe, das soll nämlich der Nutzer über ein UI erzeugen
    //und dann hätte ich auch wieder diese hässliche static-Kacke in der Main.
}

Sollte ich also automatisch immer eine neue ArrayList erzeugen lassen, wenn ein Objekt der Beispielklasse erzeuge oder wie verhindert man die Exception sonst so (Stichwort "guter Code")? Kümmert sich dann der Garbage-Collector darum, wenn ich das später nicht mehr brauche?
Wenn die Liste null ist, ist das Programm jedenfalls nicht lauffähig, also hier habe ich entweder ein tiefsitzendes Designproblem oder zu viel Angst, einfach die = new ArrayList(); einzusetzen.

Kann mir da jemand einen Tipp geben? :)
 

Marinek

Bekanntes Mitglied
Eine NPE kommt, wenn du auf eine Variable ohne "Inhalt" (also NULL) zugreifen willst. Zum Beispiel dein .add();

Pauschal gesagt: Wenn du zu einer Liste etwas hinzufügen wisst, musst du die Liste "automatisch" erzeugen.

Ich würde das so machen:

Java:
public class Beispielklasse {

    private List beispielListe;
    
    public Beispielklasse(){
        beispielListe = new ArrayList();
    }

    public Beispielklasse (BeispielObjekt objekt){
        this();
        beispielListe.add(objekt);
    }

}

Anhand deines Beispiels lassen sich viele "gute Code" Geschichten erzählen, aber wäre meines erachtens zu sehr ins blaue geraten, was du da tatsächlich brauchst.

Der GC wird das Objekt wegräumen, wenn kein Thread mehr darauf zugreifen kann. Wann das in deinem Programm und ob das überhaupt passiert, kann nicht beurteilt werden.

Poste hier deinen richtigen Code, damit man eine fundierte Code Review machen kann.
 

Wuast

Bekanntes Mitglied
Eine NPE kommt, wenn du auf eine Variable ohne "Inhalt" (also NULL) zugreifen willst. Zum Beispiel dein .add();
Grundsätzlich klar. Ich möchte also, dass die Liste nicht null ist. Deswegen klappt es ja auch, wenn ich direkt = new ArrayList(); verwende.
Aber wenn ich die über den Konstruktor deklarieren will, ist die wieder null. Das schnall ich nicht, warum ist das so?



Java:
public class Beispielklasse {

    private List beispielListe;
   
    public Beispielklasse(){
        beispielListe = new ArrayList();
    }

    public Beispielklasse (BeispielObjekt objekt){
        this();
        beispielListe.add(objekt);
    }

}
was bewirkt das this(); hier konkret? :) Und welchen Konstruktor rufst du dann in der Main auf? Weil
public Beispielklasse(){
beispielListe = new ArrayList();
}
habe ich ja selbst schon aufgerufen, da ist die Liste wieder null.

Poste hier deinen richtigen Code, damit man eine fundierte Code Review machen kann.
Da gibts einen guten Grund, warum ich das nicht getan habe :D Sorry
Aber danke für deine Rückmeldung
 

Marinek

Bekanntes Mitglied
Anhand deiner Informationen kann man maximal raten, was du da tust.

- Poste den konkreten Quellcode
- Poste die Fehlermeldung die du hast.

Eine NPE zu debuggen ist super einfach, wenn man beides hat.

Das was du hier schreibst, erzeugt keine NPE. Du machst etwas falsch, was du hier nichts zeigst.

was bewirkt das this(); hier konkret? :) Und welchen Konstruktor rufst du dann in der Main auf?

Bezüglich deines zweiten Satzes, weiß ich nicht, was du meinst. Aus dem Quellcode sollte klar sein, welcher Konstruktor aufgerufen wird.
 

KonradN

Super-Moderator
Mitarbeiter
Wie @Apple’s Jünger geschrieben hat, kann man nur raten.

Also ein typisches Problem wäre bei sowas:
Java:
public class SomeClass {
    List someList;
    
    public SomeClass() {
        List someList = new ArrayList();
    }
}

Du hast also nicht nur eine Zuweisung sondern durch den Typ eine lokale Variable deklariert.

Wichtig: Du wirst doch hoffentlich Java 8 oder neuer nutzen. List hat ein Generic und den sollte man immer angeben!

Andere Fehlersituationen sind deutlich seltener:

Java:
public class SomeClass {
    List<String> someList;
    String one = someList.get(1);
    public SomeClass() {
        List<String> someList = List.of("0", "1", "2", "3");
    }
}

Du greifst also darauf zu, ehe der Konstruktor gelaufen ist. (Das geht auch über Methoden und ganz blöd zu sehen bei Vererbungen, wenn der Konstruktor der Basisklasse eine Methode aufruft, die die abgeleitete Klasse überschreibt.)
 

temi

Top Contributor
Unabhängig von deinem konkreten Problem noch ein Hinweis: Du solltest keine "rohe" Liste verwenden, sondern einen generischen Typen angeben.

Anstatt von List list = new ArrayList(); besser etwas wie List<String> list = new ArrayList<String>(); (hier mit dem Typen "String"). Auf der rechten Seite kann die Typangabe auch weggelassen werden: List<String> list = new ArrayList<>();

Dadurch gewinnst du in deinem Programm Typsicherheit.

Sollte ich also automatisch immer eine neue ArrayList erzeugen lassen, wenn ein Objekt der Beispielklasse erzeuge

Meinst du damit, die Erzeugung der Liste, direkt bei der Instanzvariable?

Dein Konstruktor erzeugt ja ebenfalls eine Instanz der Liste und weist sie der Instanzvariablen zu. Es wird also in jedem Fall eine Instanz erzeugt, sobald eine Instanz der Beispielklasse erzeugt wird und das ist auch sinnvoll, sofern die Beispielklasse die Liste benötigt. Es kann auch Fälle geben, wo es sinnvoll ist, die Instanzvariable erst zu initialisieren, wenn sie auch tatsächlich benötigt wird. Das wäre z. B. der Fall, wenn die Erzeugung der Instanzvariablen "teuer" ist, also viel Zeit erfordert, weil Datenbankzugriffe notwendig sind, o.ä.

Java:
class Foo {
 
    private List<String> data = new ArrayList<>();
 
}

// gleichwertig

class Foo {
 
    private List<String> data;
 
    public Foo() {
        data = new ArrayList<>();
    }
}

// "verzögerte" Erzeugung der Liste, sog. "lazy initialization"

class Foo {
 
    private List<String> data;
 
    public void add(String value) {
        if (data == null) {
            data = new ArrayList<>();
        }
    
        data.add(value);
    }
 
}
 
Zuletzt bearbeitet:

Wuast

Bekanntes Mitglied
Dachte das hätte ich aber das Problem hat sich anhand der Ausführungen hier dann erübrigt. Insbesondere das
Unabhängig von deinem konkreten Problem noch ein Hinweis: Du solltest keine "rohe" Liste verwenden, sondern einen generischen Typen angeben.

Anstatt von List list = new ArrayList(); besser etwas wie List<String> list = new ArrayList<String>(); (hier mit dem Typen "String"). Auf der rechten Seite kann die Typangabe auch weggelassen werden: List<String> list = new ArrayList<>();

(...)

Java:
class Foo {
 
    private List<String> data = new ArrayList<>();
 
}

// gleichwertig

class Foo {
 
    private List<String> data;
 
    public Foo() {
        data = new ArrayList<>();
    }
}

}
hatte ich nicht auf dem Schirm. Dann gab es ja eigentlich kein Problem, bis ich eines daraus machte.
Die Typisierung ist in meinem konkreten Fall zum Glück vorhanden :)

Danke euch!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S leeres Array statt Null Pointer Exception ausgeben Java Basics - Anfänger-Themen 20
C Null Pointer Exception Java Basics - Anfänger-Themen 10
G Null Pointer Exception Java Basics - Anfänger-Themen 4
D OOP Warum bekomme ich eine Null-Pointer Exception!!? :( Java Basics - Anfänger-Themen 4
A Null Pointer Exception in Liste Java Basics - Anfänger-Themen 11
L Null Pointer Exception bei setText Java Basics - Anfänger-Themen 9
T Null Pointer Exception Java Basics - Anfänger-Themen 4
T Null Pointer Exception Java Basics - Anfänger-Themen 8
H Null Pointer Exception Problem Java Basics - Anfänger-Themen 3
L Null Pointer Exception bei Focus Event bei einem JTextField Java Basics - Anfänger-Themen 2
D Null-Pointer-Exception Java Basics - Anfänger-Themen 5
E Hash Map - Null Pointer Exception? Java Basics - Anfänger-Themen 3
B Call By reference (Null pointer exception) Java Basics - Anfänger-Themen 6
J Null Pointer Exception in der "ob Null"-Abfrage? Java Basics - Anfänger-Themen 37
B Null Pointer Exception Java Basics - Anfänger-Themen 7
A Null Pointer Exception beim Erstellen eines Arrays aus einer eigenen Klasse Java Basics - Anfänger-Themen 3
K Null pointer exception in Methode Java Basics - Anfänger-Themen 4
D Null Pointer Exception Java Basics - Anfänger-Themen 8
D null pointer exception Java Basics - Anfänger-Themen 3
M Null Pointer Exception Java Basics - Anfänger-Themen 18
T Null Pointer Exception Java Basics - Anfänger-Themen 2
F Null Pointer Exception #2 Java Basics - Anfänger-Themen 5
I Unerklärliche Null-Pointer-Exception bei JRadioButton Array Java Basics - Anfänger-Themen 2
H Null Pointer Exception? Java Basics - Anfänger-Themen 4
G Null Pointer Exception Java Basics - Anfänger-Themen 10
N null pointer exception Java Basics - Anfänger-Themen 6
S Null-Pointer-Exception Java Basics - Anfänger-Themen 5
B Null Pointer Exception Java Basics - Anfänger-Themen 2
L nur kleines null Pointer Exception problem Java Basics - Anfänger-Themen 9
R Null Pointer Exception von anderer Klasse aus. Java Basics - Anfänger-Themen 2
N NULL Pointer Exception Java Basics - Anfänger-Themen 4
J Java.lang Null Pointer Exception Java Basics - Anfänger-Themen 3
Dilandau null pointer exception - woran liegts? Java Basics - Anfänger-Themen 16
W Null-Pointer trotz Konstruktor? Java Basics - Anfänger-Themen 9
Orkanson Null Pointer Expception Java Basics - Anfänger-Themen 3
G Null Pointer Exeption Java Basics - Anfänger-Themen 8
Z Null Pointer?! WHY? Java Basics - Anfänger-Themen 11
J Null-Pointer -> Code-Zeile ausgeben möglich? Java Basics - Anfänger-Themen 7
N null pointer exeption problem Java Basics - Anfänger-Themen 4
H Null pointer Exeption Java Basics - Anfänger-Themen 4
R Thread geht jetzt - aber - Fehler "Null-Pointer" Java Basics - Anfänger-Themen 20
S Vector wirdn icht gefüllt, null Pointer, was ist der Fehler Java Basics - Anfänger-Themen 6
T Ich brauche eine Schleife die eine beliebige Zahl so lange durch 10 teilt bis zur Null Java Basics - Anfänger-Themen 5
M NullPointerException: Cannot read the array length because "this.Kinder" is null Java Basics - Anfänger-Themen 1
J 2 listen vergleichen, die auch null Elemente haben können ! Java Basics - Anfänger-Themen 9
I Grundsatzfrage: Belegt eine Referenz auf 'null' RAM, und wenn ja - wieviel ;-) ? Java Basics - Anfänger-Themen 5
H Ein übergegebenes Objekt auf null setzen Java Basics - Anfänger-Themen 9
P Buffer und null Java Basics - Anfänger-Themen 3
"java.util.HashMap.get(Object)" is null Java Basics - Anfänger-Themen 10
jakobfritzz Array- cannot invoke "" because "" is null Java Basics - Anfänger-Themen 4
W Wie ziehe ich von einer bestimmten Zahl, Zahlen ab, bis mein Ergebnis null beträgt? Java Basics - Anfänger-Themen 10
N null in String replacen Java Basics - Anfänger-Themen 16
S JavaKara Null Exception Error Java Basics - Anfänger-Themen 4
K Bufread.readLine())!= null wie beenden? Java Basics - Anfänger-Themen 4
C Variablen Provided text for message may not be null Java Basics - Anfänger-Themen 9
T ComboBox getValue() zeigt null Java Basics - Anfänger-Themen 7
J null exception Array Java Basics - Anfänger-Themen 5
tobikoch String x= null Bedeutung Java Basics - Anfänger-Themen 9
C NumberFormatException: null ohne Ausnahmebehandlung stoppen Java Basics - Anfänger-Themen 7
J Int wird als Null ausgegeben Java Basics - Anfänger-Themen 8
M Prüfen auf null ohne NPE Java Basics - Anfänger-Themen 1
C Array-Eintrag wieder auf Null setzen Java Basics - Anfänger-Themen 3
C Array auf Null-Inhalte prüfen Java Basics - Anfänger-Themen 9
V NullPointerException, wenn Key und Value null sind Java Basics - Anfänger-Themen 2
M jTable bekommt null Java Basics - Anfänger-Themen 1
B MySQL (jdbc) -> connection liefert NULL Java Basics - Anfänger-Themen 3
der_Schokomuffin Hilfe gesucht: String wird auf null gesetzt! Java Basics - Anfänger-Themen 17
L Warum ist Variable null? Java Basics - Anfänger-Themen 3
J javax.servlet.ServletException: Name is null Java Basics - Anfänger-Themen 7
B if(object== null) abkürzen? Java Basics - Anfänger-Themen 6
O JavaArray Null Java Basics - Anfänger-Themen 3
U Null Exception aber keine Ahnung warum Java Basics - Anfänger-Themen 5
W NullPointerException obwohl nicht null? Java Basics - Anfänger-Themen 3
D Best Practice Konvention - Klassenmembers auf null setzen? Java Basics - Anfänger-Themen 2
I Null-Überprüfung durch Lambda-Expressions abkürzen Java Basics - Anfänger-Themen 8
M set Integer bzw. set null mit SQL DB Java Basics - Anfänger-Themen 9
I Polymorphie Null Objekt Java Basics - Anfänger-Themen 3
O Datentypen Integer mit führender Null Java Basics - Anfänger-Themen 13
DaCrazyJavaExpert Compiler-Fehler Variable nicht mit null initialisiert, trotzdem: NullPointerException Java Basics - Anfänger-Themen 28
J Einfache Frage zu "null" Java Basics - Anfänger-Themen 2
T Datei in Array einlesen "null" Java Basics - Anfänger-Themen 8
P Operatoren Parameter nicht auf null geprüft? Java Basics - Anfänger-Themen 16
K Operatoren 2D Int Array auf Null-Referenzen prüfen Java Basics - Anfänger-Themen 18
V Elemente aus einem Array mit null überschreiben Java Basics - Anfänger-Themen 4
V String Array gegen null-Eintrag sichern Java Basics - Anfänger-Themen 11
R Gleitkommazahlen ohne führende Null Java Basics - Anfänger-Themen 10
M array = null Java Basics - Anfänger-Themen 2
F String equals NULL Problem Java Basics - Anfänger-Themen 4
F JSON null macht mir ein Problem Java Basics - Anfänger-Themen 3
R Property Value als null setzen Java Basics - Anfänger-Themen 1
D Arrays.toString spuckt null aus? Java Basics - Anfänger-Themen 3
T Compiler-Fehler Null type safety (type annotations) Java Basics - Anfänger-Themen 5
F Erste Schritte Unterschied: Array "leer" / "null" Java Basics - Anfänger-Themen 3
J Fehlerhafte Ausgabe "null" Java Basics - Anfänger-Themen 2
G Threads zum Thema Threads??? null Ahnung Java Basics - Anfänger-Themen 4
W Input/Output DataOutputStream gibt NULL zurück Java Basics - Anfänger-Themen 5
J Einfach verkettet List: Ausgabe ohne null Java Basics - Anfänger-Themen 11
D Null Ausgabe obwohl wert zugewiesen Java Basics - Anfänger-Themen 5
J Alias null Java Basics - Anfänger-Themen 4
B Aliasing bei null-Objekten Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben