Java Liste Insert Frage

sasbro97

Lt. Junior Grade
Registriert
Nov. 2014
Beiträge
417
Ich habe eine sehr allgemeine Verständnisfrage. Ich habe eine ganz normale Liste und habe das Einfügen eines neuen Elements programmiert und weiß auch das es stimmt. Aber nun die Frage: Wieso muss ich i=1 setzen, um einem NullPointer zu entgehen? Bei einem getString, also der Ausgabe von einem String an einem Index beginnt man ja mit i=0 (siehe zweiter Code). Wo ist denn der Unterschied? Überspringt man dann nicht so gesehen sogar einen Index durch das i=1?

Java:
public void insert(String string, int index)
    {
        ListenElement current = first;
        int i = 1;
        while (i < index && current != null) {
            current = current.getNext();
            i++;
        }
        
        ListenElement neu = new ListenElement();
        neu.setString(string);
        if (index == 0) {
            neu.setNext(first);
            first = neu;
            neu.setPrev(first);
        } else if (current.getNext() == null) {
            append(string);
        } else {
            neu.setNext(current.getNext());
            neu.getNext().setPrev(neu);
            current.setNext(neu);
            neu.setPrev(current);
            
        }
    
    }

Java:
public String get(int index)
    {
        ListenElement current = first;
        if (index == 0) {
            return first.getString();
        }
        
        int i = 0;
        while (i < index && current != null) {
            current = current.getNext();
            i++;
        }
        return current.getString();
        
    }
 
Wo genau tritt der Fehler auf? Sicher nicht wegen dem i=0, sondern weil irgendwo die Logik nicht ausgefeilt ist und etwas null ist, was du später verwenden willst. Z.b. wenn first nur ein Element hat (size == 0), dann versuchst du auf first.getNext() (bzw. current.getNext) zuzugreifen obwohl es kein next gibt. Würde raten die Logikschritte in Methoden auszulagern, macht es einfacher.

Ist doch ein guter Grund mal den Debugger anzuwerfen und zu schauen zu welcher Zeit du welche Werte hast :>
 
Zuletzt bearbeitet von einem Moderator:
Das Problem ist sehr wahrscheinlich folgendes und hat eher weniger was mit deinem gewählten i zu tun:

Du kannst in deiner Schleife irgendwann an dem Punkt ankommen, wo current.getNext() == null ist
Nun fragt die Schleife ab, ob current != null ist, betritt den Schleifenrumpf und current wird auf current.getNext() - also in dem Fall null - gesetzt. Dann gehts schief, wenn du später versuchts auf null dein getNext() aufzurufen.

Da du nun i auf 1 setzt, "überspringst" du einen index wie du richtig erkannt hast. Dadurch kommst du nicht in die Situation, dass current.getNext() null sein kann, weil du maximal bis zum vorletzten Element gehst, vorausgesetzt der index wird korrekt übergeben.

Mit i = 0 müsste folgendes z.B. funktionieren:

Java:
public void insert(String string, int index)
    {
        ListenElement current = first;
        int i = 0;
        while (i < index && current.getNext() != null) {
            current = current.getNext();
            i++;
        }
 
Auch dies ist gefährlich:

Code:
} else if (current.getNext() == null) {

Wenn es kein getNext() gibt, dann knallt es bevor dein null Vergleich kommt - außer deine getNext() Methode liefert tatsächlich ein null. Sicherer wäre es den Kram über size() abzufragen.
 
@HorstSch87
Was ihr zu erst nicht wissen könnt, mir ist diese Info gegeben: Du kannst davon ausgehen, dass nur gueltige Indizes uebergeben werden.

Ich glaube ich verstehe was du meinst. Ist dann wohl letztendlich ein kleiner Merksatz. Wenn first noch nicht null ist, aber sein Nachfolger, dann gehen wir trotzdem an der Stelle weiter. Und dieses else if (current.getNext() == null) kann ich dann eben gar nicht mehr aufrufen, weil wir bereits bei null sind.
 
Kann first null seien? Falls ja, dann dürfte dein get bei einer leeren Liste auch schief gehen.
 
Sorry, noch ein Nachtrag. Also Grundsatzregel:
Entweder man skippt den Index und macht i = 1 in Verbindung mit current != null oder

man macht i = 0 und current.getNext() != null

ist das so richtig? Das gilt dann bestimmt auch für getAtIndex usw.
 
Die 2. Variante ist besser, die 1. kann bei einem falschem Index schief gehen.
 
Alles klar. Danke euch vielmals. Ich wollte unbedingt verstehen, warum man manchmal 0 macht und manchmal 1 oder bzw. warum es mal geht und mal nicht. Hauptsache im Skript ist es mit i=1 und current != null...
Danke für nichts Lehrstuhl :D
 
Zurück
Oben