Liste Knoten NullPointerException

Honksponk

Mitglied
Hallo zusammen,

ich möchte eine Liste programmieren und habe eine Methode, die mir die nächsten Knoten rekursiv mit einer Zahl belegen soll.
Das funktioniert:
start ist der Anfangsknoten. start.next = new Knoten(1)
start.next.next = new Knoten(2)

Wenn ich mir hier über die Konsole start.next ausgeben lassen will geht das, aber mit meiner Methode kann ich das nicht, weil es angeblich null ist.

Warum funktioniert meine Methode nicht? Und was kann ich da besser machen?
Java:
int index = 1;

public void init(Knoten k){
      if(index != 50) {
              k = new Knoten(index);
              index++;
              init(k.next);
      }
  }
 

httpdigest

Top Contributor
Die Zuweisung k = new Knoten(index); weist lediglich der lokalen Variable bzw. dem lokalen Parameter der Methode k einen neuen Wert zu.
Der Methodenaufruf von init(k.next) weiß ja aber nicht, wo der Wert von k für das Argument des Methodenaufrufes init(...) übrsprünglich einmal herkam (nämlich vom Feld k.next).
Man kann also nicht in einer Methode per Zuweisung zu einem Parameter das Feld ändern, von dem das Argument für den Parameter beim Methodenaufruf einmal gelesen wurde.

Der Parameter k der Methode init(Knoten k) enthält also keine "Referenz" auf das Feld bzw. die Instanzvariable next eines Knotens, sondern eine Referenz auf den Wert selbst, der zum Zeitpunkt des Methodenaufrufes in k.next gespeichert war (ohne Information darüber, wo der Wert für das Argument des Methodenaufrufes einmal herkam).
 

Honksponk

Mitglied
Heißt ich arbeite eigentlich mit einer Kopie, die nach Durchlauf meiner Methode wieder verschwunden ist ohne, dass ich an meinem Knoten start etwas verändert habe ...

Mit der Methode hätte ich ja was erreicht nur bin ich dann am Ende der Liste mit meinem Start und will wieder zurück.
Und wenn ich eine Kopie von Start erstelle und die ablaufe, dann kann ich nur die Kopie verändern ...

Java:
  public void einfuegen(Knoten k){
      while(start != null){
          start = start.next;
      }
      start = k;
  }
 

httpdigest

Top Contributor
Stelle es dir einfach so vor. Angenommen, ich gebe dir folgende Methode (ohne, dass du andere Methoden kennen würdest), was würdest du denken, dass diese Methode tut?
Java:
public void veraendereEtwas(Knoten k) {
  k = new Knoten(1);
}
Und genauso sieht das auch Java bzw. die JVM. Hier wird einfach der lokalen Variablen (bzw. des Parameters) k eine Referenz eines neuen Objektes zugewiesen. Fertig. Und danach wird die Methode beendet und der Effekt ist keiner.
 

Honksponk

Mitglied
Stelle es dir einfach so vor. Angenommen, ich gebe dir folgende Methode (ohne, dass du andere Methoden kennen würdest), was würdest du denken, dass diese Methode tut?
Java:
public void veraendereEtwas(Knoten k) {
  k = new Knoten(1);
}
Und genauso sieht das auch Java bzw. die JVM. Hier wird einfach der lokalen Variablen (bzw. des Parameters) k eine Referenz eines neuen Objektes zugewiesen. Fertig. Und danach wird die Methode beendet und der Effekt ist keiner.
Das leuchtet ein, weil ich nichts zuweise und wenn ich jetzt eine lokale Variable gleich dem Knoten k setze, sollte es diese doch verändern?
Das funktioniert dann auch super, dann habe ich meine globale Variable start aber am Ende wie oben ...
Ich laufe durch und setze start auf neues Element. Eigentlich müsste ich ja start.next.next.next ... = neues Element setzen. Wie schaffe ich das?
 

KonradN

Super-Moderator
Mitarbeiter
Das wichtige ist das Verständnis, wie das mit den Referenzen funktioniert.

Sieh eine Referenz an als eine Art Adresse an.

Variablen sind dann eine Art Zettel - auf der kann dann eine Adresse stehen.

Wenn Du eine Methode aufrufst, dann wird bei den Parametern die Regel "Call by Value" angewendet, d.h. das, was da als Werte angegeben wird, wird kopiert. Bei einem Methodenaufruf, bei dem Du eine Variable angibst als Parameter wird also nur der Inhalt der Variablen kopiert.

Bei einer Methode wie
Java:
public void init(Knoten k) {
  k = ....;
}
bedeutet das also: Beim Aufruf wird eine Variable angegeben. Dessen Inhalt (die Referenz) wird nun kopiert in den Parameter k. Wenn k geändert wird, dann ändert sich aber nur der Inhalt vom Parameter und nicht das, was da in der Variablen ist, die da beim Aufruf verändert wurde.

Wenn das mit dem Zettel Vergleich nehmen würde, dann kann man sich das bildlich so vorstellen:
Du hast einen Zettel, da steht die Adresse von einem Knoten drauf. Du rufst mich an (Gestatten: Mein Name ist init! :) ) und gibst mir die Adresse, die auf Deinem Zettel steht per Telefon durch. Diese schreibe ich auf einen Zettel (in dessen obere rechte Ecke ich "k" schreibe. Das ist aber egal). Dann streiche ich die Adresse durch und schreibe eine neue Adresse auf meinen Zettel.
==> Die Adresse auf dem Zettel, die Du hast, ist also weiterhin unverändert.

Das Gleiche passiert auch jetzt etwas in Deiner Methode (Wenn man mal davon absieht, dass start ja den Start der Liste entspricht und beim Anhängen ändert sich das ja nicht!):
Code:
      while(start != null){
          start = start.next;
      }

      start = k;

Damit man das erklären kann, muss man sich erst einmal bildlich vorstellen, was ein Knoten ist. Ein Knoten ist einfach ein Haus. In dem Haus sind viele Zettel. Auf diesen stehen dann entweder Werte (also bei Typ int und so) oder Referenzen. Bei Knoten ist da ein Zettel das oben rechts stehen hat "next".

Nun hast Du einen Zettel mit dem Titel "start". Da ist eine Adresse von einem Haus drin.
Nun gehst Du so lange, wie Du eine Adresse hast, in das Haus der Adresse und kopierst die Adresse auf dem Zettel "next" dort auf Deinen Zettel.
Irgendwann hast Du dann einen leeren Zettel und wenn das der Fall ist, dann schreibst Du auf Deinen Zettel die Adresse des neuen Knoten.

Das willst Du aber doch nicht. Du willst eine Kette haben.

Knoten1 -> Knoten2 -> Knoten3 -> null
(Mit den -> jeweils der Referenz "next")

Und wenn du nun Knoten4 hinter Knoten3 hängen willst und "start" der Pfeil auf den ersten Knoten der Liste ist, dann gehst Du wie vor?

Überlege Dir das.
 

Honksponk

Mitglied
Das wichtige ist das Verständnis, wie das mit den Referenzen funktioniert.

Sieh eine Referenz an als eine Art Adresse an.

Variablen sind dann eine Art Zettel - auf der kann dann eine Adresse stehen.

Wenn Du eine Methode aufrufst, dann wird bei den Parametern die Regel "Call by Value" angewendet, d.h. das, was da als Werte angegeben wird, wird kopiert. Bei einem Methodenaufruf, bei dem Du eine Variable angibst als Parameter wird also nur der Inhalt der Variablen kopiert.

Bei einer Methode wie
Java:
public void init(Knoten k) {
  k = ....;
}
bedeutet das also: Beim Aufruf wird eine Variable angegeben. Dessen Inhalt (die Referenz) wird nun kopiert in den Parameter k. Wenn k geändert wird, dann ändert sich aber nur der Inhalt vom Parameter und nicht das, was da in der Variablen ist, die da beim Aufruf verändert wurde.

Wenn das mit dem Zettel Vergleich nehmen würde, dann kann man sich das bildlich so vorstellen:
Du hast einen Zettel, da steht die Adresse von einem Knoten drauf. Du rufst mich an (Gestatten: Mein Name ist init! :) ) und gibst mir die Adresse, die auf Deinem Zettel steht per Telefon durch. Diese schreibe ich auf einen Zettel (in dessen obere rechte Ecke ich "k" schreibe. Das ist aber egal). Dann streiche ich die Adresse durch und schreibe eine neue Adresse auf meinen Zettel.
==> Die Adresse auf dem Zettel, die Du hast, ist also weiterhin unverändert.

Das Gleiche passiert auch jetzt etwas in Deiner Methode (Wenn man mal davon absieht, dass start ja den Start der Liste entspricht und beim Anhängen ändert sich das ja nicht!):
Code:
      while(start != null){
          start = start.next;
      }

      start = k;

Damit man das erklären kann, muss man sich erst einmal bildlich vorstellen, was ein Knoten ist. Ein Knoten ist einfach ein Haus. In dem Haus sind viele Zettel. Auf diesen stehen dann entweder Werte (also bei Typ int und so) oder Referenzen. Bei Knoten ist da ein Zettel das oben rechts stehen hat "next".

Nun hast Du einen Zettel mit dem Titel "start". Da ist eine Adresse von einem Haus drin.
Nun gehst Du so lange, wie Du eine Adresse hast, in das Haus der Adresse und kopierst die Adresse auf dem Zettel "next" dort auf Deinen Zettel.
Irgendwann hast Du dann einen leeren Zettel und wenn das der Fall ist, dann schreibst Du auf Deinen Zettel die Adresse des neuen Knoten.

Das willst Du aber doch nicht. Du willst eine Kette haben.

Knoten1 -> Knoten2 -> Knoten3 -> null
(Mit den -> jeweils der Referenz "next")

Und wenn du nun Knoten4 hinter Knoten3 hängen willst und "start" der Pfeil auf den ersten Knoten der Liste ist, dann gehst Du wie vor?
 
Zuletzt bearbeitet:

Honksponk

Mitglied
Das wichtige ist das Verständnis, wie das mit den Referenzen funktioniert.

Sieh eine Referenz an als eine Art Adresse an.

Variablen sind dann eine Art Zettel - auf der kann dann eine Adresse stehen.

Wenn Du eine Methode aufrufst, dann wird bei den Parametern die Regel "Call by Value" angewendet, d.h. das, was da als Werte angegeben wird, wird kopiert. Bei einem Methodenaufruf, bei dem Du eine Variable angibst als Parameter wird also nur der Inhalt der Variablen kopiert.

Bei einer Methode wie
Java:
public void init(Knoten k) {
  k = ....;
}
bedeutet das also: Beim Aufruf wird eine Variable angegeben. Dessen Inhalt (die Referenz) wird nun kopiert in den Parameter k. Wenn k geändert wird, dann ändert sich aber nur der Inhalt vom Parameter und nicht das, was da in der Variablen ist, die da beim Aufruf verändert wurde.

Wenn das mit dem Zettel Vergleich nehmen würde, dann kann man sich das bildlich so vorstellen:
Du hast einen Zettel, da steht die Adresse von einem Knoten drauf. Du rufst mich an (Gestatten: Mein Name ist init! :) ) und gibst mir die Adresse, die auf Deinem Zettel steht per Telefon durch. Diese schreibe ich auf einen Zettel (in dessen obere rechte Ecke ich "k" schreibe. Das ist aber egal). Dann streiche ich die Adresse durch und schreibe eine neue Adresse auf meinen Zettel.
==> Die Adresse auf dem Zettel, die Du hast, ist also weiterhin unverändert.

Das Gleiche passiert auch jetzt etwas in Deiner Methode (Wenn man mal davon absieht, dass start ja den Start der Liste entspricht und beim Anhängen ändert sich das ja nicht!):
Code:
      while(start != null){
          start = start.next;
      }

      start = k;

Damit man das erklären kann, muss man sich erst einmal bildlich vorstellen, was ein Knoten ist. Ein Knoten ist einfach ein Haus. In dem Haus sind viele Zettel. Auf diesen stehen dann entweder Werte (also bei Typ int und so) oder Referenzen. Bei Knoten ist da ein Zettel das oben rechts stehen hat "next".

Nun hast Du einen Zettel mit dem Titel "start". Da ist eine Adresse von einem Haus drin.
Nun gehst Du so lange, wie Du eine Adresse hast, in das Haus der Adresse und kopierst die Adresse auf dem Zettel "next" dort auf Deinen Zettel.
Irgendwann hast Du dann einen leeren Zettel und wenn das der Fall ist, dann schreibst Du auf Deinen Zettel die Adresse des neuen Knoten.

Das willst Du aber doch nicht. Du willst eine Kette haben.

Knoten1 -> Knoten2 -> Knoten3 -> null
(Mit den -> jeweils der Referenz "next")

Und wenn du nun Knoten4 hinter Knoten3 hängen willst und "start" der Pfeil auf den ersten Knoten der Liste ist, dann gehst Du wie vor?

Überlege Dir das.
Die Erklärung hat mir sehr geholfen. Ich brauche einfach nur einen 2. Zettel, den ich ins neue Haus lege. Nach einigem hin und her habe ich eine Lösung für mein Problem finden können. Kopie von start -> ans Ende schieben -> Kopie auf neues Element setzen :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Y Knoten an einem gegebenen Index aus einer Liste entfernen. Java Basics - Anfänger-Themen 6
O Knoten und Liste verarbeitung Java Basics - Anfänger-Themen 20
R Methoden Entferne alle identische Knoten (Typ String) aus verkettete Liste Java Basics - Anfänger-Themen 8
I Erste Schritte Referenz zum Knoten davor, in einer Liste Java Basics - Anfänger-Themen 4
D An bestimmten Knoten einer Liste zugreifen Java Basics - Anfänger-Themen 4
R Liste in Variable speichern Java Basics - Anfänger-Themen 6
R Liste und Arrays Java Basics - Anfänger-Themen 12
D 2 ArrayListen gleich sortieren bzw. eine Liste anhand einer anderen Sortieren Java Basics - Anfänger-Themen 6
J Ähnlichen String in Liste finden Java Basics - Anfänger-Themen 6
M Verkettete Liste Java Basics - Anfänger-Themen 1
M Vergleichen, ob eine Liste länger als andere ist Java Basics - Anfänger-Themen 6
H Liste nach String-Länge sortieren Java Basics - Anfänger-Themen 1
D remove Object von einer Liste von Obejcts Java Basics - Anfänger-Themen 3
E Elemente aus Liste entfernen und hinzufügen Java Basics - Anfänger-Themen 3
M Nullpointer beim befüllen meiner Liste im Object Java Basics - Anfänger-Themen 3
D Länge einer Liste aufrufen. Java Basics - Anfänger-Themen 19
B Objekt aus generalisierter Liste entfernen Java Basics - Anfänger-Themen 11
W Liste mit Listen in JTable darstellen Java Basics - Anfänger-Themen 1
N Was Passiert mit dem Namen einer Variable, wenn man diese einer Liste Hinzufügt Java Basics - Anfänger-Themen 16
E Suchfunktion in einer Liste Java Basics - Anfänger-Themen 39
T ungeordnete Werte-Paare in einer Liste Java Basics - Anfänger-Themen 7
L Hilfe! Liste mit Items werden ausgegeben aber nicht in zufälliger Reihenfolge Java Basics - Anfänger-Themen 6
berserkerdq2 Warum soll ich shuffle nutzen, um bei Rückgabewert Collection eine Liste zurückzugeben? Java Basics - Anfänger-Themen 3
sserio Wieso werden nicht alle Primzahlen bis 1000 in meine Liste gepackt ? Java Basics - Anfänger-Themen 8
sserio Liste erstellt und ein Problem mit dem Index Java Basics - Anfänger-Themen 8
f3mys Objektwerte in Liste speichern und wieder abrufen Java Basics - Anfänger-Themen 23
H Java verkettete Liste, Wert eines Index zurückgeben Java Basics - Anfänger-Themen 1
K Warum ist die binäre Suche bei der verketteten Liste nicht so effektiv? Java Basics - Anfänger-Themen 3
I 2D-Array Position der Liste ausgeben. Java Basics - Anfänger-Themen 2
I Liste von Infos von einer eigenen Annotation in Liste speichern Java Basics - Anfänger-Themen 0
P Doppelte werte in einer Liste zählen Java Basics - Anfänger-Themen 11
Dorfschmied Kartesisches Produkt von zwei Liste mit Hashmaps<String,String> erstellen Java Basics - Anfänger-Themen 4
Igig1 Autoparkplatz verkettete Liste erstes und letztes Auto Java Basics - Anfänger-Themen 13
thor_norsk Verkette Liste Java Basics - Anfänger-Themen 27
R Rückgabe: verkettete Liste Java Basics - Anfänger-Themen 2
R einfach verkettete Liste Java Basics - Anfänger-Themen 1
R einfach verkettete Liste Java Basics - Anfänger-Themen 12
O Doppelt verkette Liste Element löschen Java Basics - Anfänger-Themen 15
B GUI extension mit einer Liste verbinden Java Basics - Anfänger-Themen 1
B Verkettete Liste durchgehen und einzelne Elemente in neue Liste tun Java Basics - Anfänger-Themen 9
B Bin komplett am verzweifeln :( Verkettete Liste die Objekte hat Attribut auslesen Java Basics - Anfänger-Themen 14
M Java Liste streamen Java Basics - Anfänger-Themen 10
AmsananKING Aussortierung einer Liste Java Basics - Anfänger-Themen 8
A Objekte mit Parametern in eine Liste packen Java Basics - Anfänger-Themen 19
A Korrigierte <String> Liste zurückgeben Java Basics - Anfänger-Themen 22
S Kann nicht auf die Liste zugreifen mit der Methode!? Java Basics - Anfänger-Themen 3
B Datentyp für Einzelnes Objekt oder Liste Java Basics - Anfänger-Themen 9
alice98 Erste Schritte Liste erstellen ohne vorgefertigte Klassen Java Basics - Anfänger-Themen 1
J Doppelt verkette Liste ich bitte um Hilfe Java Basics - Anfänger-Themen 4
I Liste gruppieren nach Monat? Java Basics - Anfänger-Themen 5
districon Element in Liste einfügen Java Basics - Anfänger-Themen 1
B Hilfe bei Map Liste erstellen Java Basics - Anfänger-Themen 10
Y Einfügen in eine doppelt verkettete Liste Java Basics - Anfänger-Themen 8
H Daten aus einer Datei in eine Liste speichern Java Basics - Anfänger-Themen 23
Gaudimagspam Linked Liste Java Basics - Anfänger-Themen 4
Z Liste umkehren Java Basics - Anfänger-Themen 1
S Eine Liste kopieren Java Basics - Anfänger-Themen 13
java3690 Java- liste füllen ud die werte addieren Java Basics - Anfänger-Themen 13
java3690 Liste mit zufälligen zahlen füllen Java Basics - Anfänger-Themen 27
java3690 eine liste sortieren Java Basics - Anfänger-Themen 12
J Element aus Liste nehmen Java Basics - Anfänger-Themen 3
B JUnit 4: Wie man die eigene Liste testen kann [TDD] Java Basics - Anfänger-Themen 46
B Interface List - Objekt übergeben? Einzelnes Objekt geht, aber Liste nicht? Java Basics - Anfänger-Themen 4
P Was genau bringt mir es ein Array in eine Liste zu bringen Java Basics - Anfänger-Themen 3
A Doppelt verkettete Liste rückwärts ausgeben Java Basics - Anfänger-Themen 17
P Verschachtelte Array Liste Java Basics - Anfänger-Themen 2
H Liste speichern. Was lässt sich verbessern? Java Basics - Anfänger-Themen 7
P Performance Array und Liste Java Basics - Anfänger-Themen 13
M QuickSort und Liste Java Basics - Anfänger-Themen 6
N Methode um Objekte einer Liste hinzuzufügen Java Basics - Anfänger-Themen 1
B Summe von Property innerhalb einer Liste via Lambda Java Basics - Anfänger-Themen 1
V Collections int Werte in einer Liste sortieren Java Basics - Anfänger-Themen 23
B Neue Liste erstellen, wenn Objekte bestimmte Referenz hat / Gruppierung von Einträgen Java Basics - Anfänger-Themen 12
V_Fynn03 Beliebiges Element in einer Liste löschen (Java)(Lineare Datenstrukturen) Java Basics - Anfänger-Themen 9
L Baum aus Integer Liste erstellen Java Basics - Anfänger-Themen 0
CptK Koordinate in Liste suchen Java Basics - Anfänger-Themen 20
C Verschiedene Objekte in einer Liste speichern Java Basics - Anfänger-Themen 6
M Ausgabe einer Liste welche mehrere Stacks enthält Java Basics - Anfänger-Themen 3
D Doppelt Verkettete Zirkular-Liste Java Basics - Anfänger-Themen 1
L Liste in anderem Thread laden Java Basics - Anfänger-Themen 1
M Array liste Verdrehen Java Basics - Anfänger-Themen 8
A Verkettete Liste Java Basics - Anfänger-Themen 2
J Strings untereinander in einer Liste vergleichen Java Basics - Anfänger-Themen 18
B Liste von Tagen generieren ab einem bestimmten Datum und Endedatum Java Basics - Anfänger-Themen 4
S IndexOutOfBoundsException beim hinzufügen eines Elements zu einer Liste Java Basics - Anfänger-Themen 11
B Liste sortieren? Java Basics - Anfänger-Themen 4
O Anonyme Klasse einer Liste erstellen Java Basics - Anfänger-Themen 7
B SWAP List; Liste neu anordnen Java Basics - Anfänger-Themen 4
B CSS Klassen in eine Liste schreiben Java Basics - Anfänger-Themen 4
B Doppelt verkettete Liste implementieren Java Basics - Anfänger-Themen 8
L verkettete Liste Java Basics - Anfänger-Themen 15
scratchy1 doppelt verkettete Liste testen Java Basics - Anfänger-Themen 8
O ADT Liste z. B. Java Basics - Anfänger-Themen 15
B sortierte Liste Java Basics - Anfänger-Themen 4
C Methoden Über eine einfach verkettete Liste Java Basics - Anfänger-Themen 8
J Eine Liste von Listen erstellen Java Basics - Anfänger-Themen 11
A Einträge aus Tupeln nach Regeln in Liste speichern Java Basics - Anfänger-Themen 8
Queiser Liste zurückgeben Java Basics - Anfänger-Themen 7
T Collections Geeignete Collection/Liste/Datenbank Java Basics - Anfänger-Themen 17
S spezielle Wörter aus Liste entfernen Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben