Frage von gerlochi, 57

Warum entsteht eine NullPointerException(Java)?

Ich schaue mir den Code immer und immer wieder an, vergleiche ihn mit dem Vorbild und trotzdem entdecke ich keinen Fehler.... Habt ihr den Fehler gefunden?

Variable.java: http://pastebin.com/NkCiqM2d Scope.java: pastebin com/S8R37eV8 Value.java: pastebin com/18JKbifU

Musste bei den letzten beiden Link's die Punke wegnehmen, da die Frage sonnst als Spam interpretiert wird.

Bei weiteren Source Fragen, einfach stellen, ich schicke sie dann.

Hilfreichste Antwort - ausgezeichnet vom Fragesteller
von KnusperPudding, Community-Experte für Java, 11

Wenn man das etwas genauer betrachtet:

    public Scope(){}   
    public Scope(Scope parent)
    {
        this.parent = parent;
    }

Hast du zwei Konstruktoren. - Sofern du entweder Konstruktor 1 (ohne Parameter) verwendest oder Konstruktor2  verwendest und null übergibst, wird es immer zur Nullpointer-Exception kommen, denn es gibt dann einfach noch keine Instanz zu deinem "Parent".

Entsprechend würde ich um das Risiko zu mindern den ersten Konstruktor weg lassen, da du ja eigentlich immer einen Parent benötigst. oder?

Um eine Exception zu vermeiden kannst du natürlich direkt abfragen ob die Variable null ist:

if (parent != null) {
  parent.load(...);
}
Antwort
von Willibergi, 43

Hierbei wäre die exakte Fehlermeldung sowie eine Zeilenangabe des Fehlers hilfreich (wobei die Zeile implizit in der Fehlermeldung enthalten ist ^^). 

Allgemein entsteht eine NullPointerException, wenn du versuchst, auf ein Objekt zuzugreifen, dass einen null-Wert hat und somit nichts referenziert.

LG Willibergi

Kommentar von gerlochi ,
Exception in thread "main" java.lang.NullPointerException
at org.bitbucket.triploit.nypp.Scope.load(Scope.java:29)
at parser.Parse.loadValue(Parse.java:92)
at parser.Parse.enterSystem(Parse.java:84)
at parser.Parse.executionPase(Parse.java:34)
at parser.Parse.execute(Parse.java:22)
at Main.main(Main.java:32)

Hab ich leider vergessen :D

Antwort
von CrystalixXx, 18

Wie initialisierst du das Objekt der Klasse "Scope"?

Der parameterlose Konstruktor erzeugt nämlich kein Objekt für die Variable "parent". In der load-Methode hingegen greifst du auf das (Null-)Objekt zu.

Mehr kann ich dazu nicht sagen; ich habe bisher nie in Java programmiert.

Kommentar von gerlochi ,
private Scope scope = new Scope();

Deklarieren und Laden

public Value loadValue(String keyword)
{
return scope.load(keyword).getValue();
}
Kommentar von CrystalixXx ,

Mit der Zeile "new Scope()" erzeugst du ein neues Objekt der Scope-Klasse (dein zweiter Link). Dort wird der parameterlose Konstruktor aufgerufen, das heißt "this.parent = parent;" wird nicht ausgeführt und bleibt null.

"scope.load" ruft dann die load-Methode auf und wird in Zeile 31 (im zweiten Link) die Referenz von "parent" auflösen wollen, was aber einen Null-Verweis darstellt. Daher die Ausnahme, so vermute ich.

Kommentar von gerlochi ,

danke dir!

Antwort
von androhecker, 41

Die Exception wäre nützlich, und würdest du nicht deine Klassennamen mit einem Punkt versehen, könntest du auch mehr Links hinzufügen.

PS: Eine NullPointerException ist ein so simpler Fehler, den kann man schneller mit dem Debugger finden.

Kommentar von Willibergi ,

"und würdest du nicht deine Klassennamen mit einem Punkt versehen, könntest du auch mehr Links hinzufügen."

Auf gutefrage.net kann man allgemein nur maximal einen Link in einen Beitrag hinzufügen, da dieser sonst als Spam interpretiert werden. Eine Änderung des Klassennamens würde also keine Besserung bringen. ^^

LG Willibergi

Kommentar von gerlochi ,

@Willibergi Danke für deinen Beistand :D

@androhecker: Such den Error :-/, hier ist die Fehlermeldung:

Exception in thread "main" java.lang.NullPointerException
at org.bitbucket.triploit.nypp.Scope.load(Scope.java:29)
at parser.Parse.loadValue(Parse.java:92)
at parser.Parse.enterSystem(Parse.java:84)
at parser.Parse.executionPase(Parse.java:34)
at parser.Parse.execute(Parse.java:22)
at Main.main(Main.java:32)


(Parse.java hat damit nichts zu tun, müsstest du aber wissen :-) )

Kommentar von CrystalixXx ,

Ich habe schon öfter Antworten mit mehreren Links in einem Beitrag geschrieben. Grundsätzlich funktioniert das, eventuell ist das vom Fraganten-Status abhängig (oder wovon auch immer).

Kommentar von gerlochi ,

Hauptsache man ist zum Code gelangt.

Kommentar von androhecker ,

Ich konnte schon immer mehr als einen Link hinzufügen, und deine Klassennamen werden auch als Link gewertet, was schon mal beweist, dass es nicht maximal einer ist.

Kommentar von SirNik ,

früher, als ich auch noch kein Fragant war, konnte man tatsächlich nur einen Link einfügen. mittlerweile darf ich verlinken was geht ;)

Antwort
von varlog, 31

Übersehe ich da irgendwie eine Main Methode? Ohne kann man es nicht so ganz nachvollziehen warum der Fehler auftritt. Meine Vermutung ist aber, dass du load mit einem Wert aufrufst, der in keiner Arraylist in der Scope-Kette vorhanden ist. 

Wenn man das macht landet man entweder irgendwann bei einem Scope mit parent= null --> Nullpointerexception. Oder bekommt 'nen Stackoverflow, wenn man einen Zyklus in der Scope-Kette hat.

Kommentar von gerlochi ,

Danke, das scheint sehr sinnvol, kann ich auch nachvollziehen. Ich werde mal rumprobieren und warten was die anderen noch dazu sagen.

Keine passende Antwort gefunden?

Fragen Sie die Community

Weitere Fragen mit Antworten