OOP Warum bekomme ich eine Null-Pointer Exception!!? :(

duxjava

Neues Mitglied
Hallo, ich bin etwas unsicher ob mir überhaupt jemand helfen wird, aber falls doch jemand bereit ist habe ich folgendes Problem:

Es handelt sich ein simples Telefonlistenprogramm in Java mit nur 2 Klassen. Es geht einzig um das Üben und Verstehen der Zeiger.

Programm besteht aus der Klasse "TelefonlistenEintrag" und einmal "Telefonliste". In der Telefonliste gibt es die Methode "addEintrag", womit man einen neuen Telefonlisten-Eintrag generieren kann. In dieser Methode muss ich allerdings erst einmal mit "getEintragAusListe" Prüfen, ob ein Eintrag exisiert und falls ja, zurückliefern. Und mit dieser Private Methode habe ich auch mein Problem. Ich hoffe ihr könnt mir erklären, warum der untere Code (meiner) nicht funktioniert.

Telefonlisteneintrag
TelefonlistenKopf; //Zeiger auf das erste Objekt, das erzeugt wird

//////////////////private Methode//////////////////////
private Telefonlisteneintrag getEintragAusListe(String name) {
/* Liefere das Eintrags-Objekt aus der Liste oder null, falls nicht
vorhanden */

Telefonlisteneintrag aktEintrag = telefonlistenKopf;
boolean gefunden = false;

/* Liste durchlaufen, bis das gesuchte Element gefunden ist */
while ((aktEintrag != null) && !gefunden) {
if (aktEintrag.getName().equals(name)) {
gefunden = true;
} else {
aktEintrag = aktEintrag.getNachfolger();
}
}

return aktEintrag;
}

....................................................................................................
Bei meiner Version bekomme ich allerdings eine Null Pointer Exception:

///////private Methode///////
private Telefonlisteneintrag getEintragAusListe(String name){

Telefonlisteneintrag aktEintrag = telefonlistenKopf;
boolean gefunden = false;

if(aktEintrag != null){

while(!gefunden){
if(aktEintrag.getName().equals(name)){
gefunden = true;
}else{
aktEintrag = aktEintrag.getNachfolger();
}
}

}
return aktEintrag;
}



Woran kanns liegen?

Vielen Dank im Voraus!
 
Zuletzt bearbeitet:
Java:
private Telefonlisteneintrag getEintragAusListe(String name) {
    Telefonlisteneintrag aktEintrag = telefonlistenKopf;
    boolean gefunden = false;

    if(aktEintrag != null) {
        while(!gefunden) {
            if(aktEintrag.getName().equals(name)) {
                gefunden = true;
            } else {
                aktEintrag = aktEintrag.getNachfolger();
            }
        }
     }

    return aktEintrag;
}

Ich vermute mal ganz stark, dass der aktEintrag durch "getNachfolger()" zu null wird und dann getName() die Exception schmeisst, da du eine Funktion auf einem null-"Objekt" aufrufen möchtest. Das geschieht, wenn der Eintrag quasi noch nicht enthalten ist und du alle Einträge prüfst. Zwangsläufig gibt es keinen Nachfolger und die While-Schleife ist noch nicht beendet, da du dich an "gefunden" orientierst. Du solltest zusätzlich in der Schleife prüfen ob aktEintrag noch gültig ist.

Ach ja, bitte verwende beim nächsten mal die JAVA - Tags für deinen Code 🙂
 
Zuletzt bearbeitet:
Ich danke dir! 🙂 Könnte mir jemand einen großen Gefallen tun und mir evtl einen Tipp geben, was ich genau an meinem Code ändern müsste? Ich habe die Begründung oben nicht 100% nachvollziehen können, da ich folgendes dachte:

Code:
[COLOR=#000000][B]if[/B][/COLOR][COLOR=#009900]([/COLOR]aktEintrag [COLOR=#339933]!=[/COLOR] [COLOR=#000066][B]null[/B][/COLOR][COLOR=#009900]) //WENN ein Telefonlisten-Eintrag Existiert, dann soll mit der while Schleife der Eintrag gesucht werden.
[/COLOR]
           Und hier(es existiert also ein Telefon-Eintrag):
 [COLOR=#000000][B]while[/B][/COLOR][COLOR=#009900]([/COLOR][COLOR=#339933]![/COLOR]gefunden[COLOR=#009900])[/COLOR] [COLOR=#009900]{     //finde den Eintrag, solange NICHT gefunden:[/COLOR]
            [COLOR=#000000][B]if[/B][/COLOR][COLOR=#009900]([/COLOR]aktEintrag.[COLOR=#006633]getName[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR].[COLOR=#006633]equals[/COLOR][COLOR=#009900]([/COLOR]name[COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]  [COLOR=#00ff00]//Wenn der gesuchte Name mit der aus der Liste übereinstimmt, while beenden[/COLOR]

                gefunden [COLOR=#339933]=[/COLOR] [COLOR=#000066][B]true[/B][/COLOR][COLOR=#339933];[/COLOR]
            [COLOR=#009900]}[/COLOR] [COLOR=#000000][B]else[/B][/COLOR] [COLOR=#009900]{[/COLOR]                               [COLOR=#00ff00] //andernfalls: gehe mit Zeiger zum nächsten Eintrag.[/COLOR]

                aktEintrag [COLOR=#339933]=[/COLOR] aktEintrag.[COLOR=#006633]getNachfolger[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
            [COLOR=#009900]}[/COLOR]
}

Habe ich da etwas übersehen? ;( Wäre unendlich Dankbar wann mir jemand meinen "Code" anpassen könnte, natürlich anders als das erste Beispiel.
Ich verstehe vorallem nicht, wie es zum "Null Pointer" kommt, da die while Schleife doch erst beginnt, WENN ein eintrag existiert:bahnhof:

Schönen Abend an alle.
Viele Grüße





 
Zuletzt bearbeitet:
Richtig die while-schleife wird erst aufgerufen wenn ein listenelement exisitert. Aber du prüfst nicht wann die liste fertig ist...

Java:
private Telefonlisteneintrag getEintragAusListe(String name) {
    Telefonlisteneintrag aktEintrag = telefonlistenKopf;
    boolean gefunden = false;
 
    
        while(!gefunden && aktEintrag != null) {
            if(aktEintrag.getName().equals(name)) {
                gefunden = true;
            } else {
                aktEintrag = aktEintrag.getNachfolger();
            }
        }
    
 
    return aktEintrag;
}
 

Neue Themen


Zurück
Oben