Wie kommt diese NullPointerException zustande?

ahretour

Mitglied
Hi! Ich bin neu in diesem Forum und weiß nicht genau ob das in diesem Thread richtig ist, aber ich versuch es mal.

Ich habe ein kleines Problem beim implementieren einer doppelt verketteten Liste.

Die doppelt verkettete Liste kennt Knoten. Diese Knoten bestehen aus einer Bestellung und zwei Referenzen, eine auf den vorherigen Knoten und eine auf den nächsten Knoten.

Hier zunächst mal die Knoten-Klasse:

Java:
public class Knoten {
	private Bestellung b;
	private Knoten vorheriger;
	private Knoten naechster;
	
	private Knoten(){
		
	}
	
	public Knoten(Bestellung best, Knoten next, Knoten prev){
		DoppeltVerketteteListe.anzKnoten++;
		this.setBestellung(best);
		this.setNaechster(next);
		this.setVorheriger(prev);
	}
	

	
	public void setBestellung(Bestellung best){
		b=best;
	}
	
	public Bestellung getBestellung(){
		return b;
	}
	
	public void setVorheriger(Knoten v){
		vorheriger=v;
	}
	
	public void setNaechster(Knoten n){
		naechster=n;
	}
	
	public Knoten getVorheriger(){
		return vorheriger;
	}
	
	public Knoten getNaechster(){
		return naechster;
	}
	
	@Override
	public String toString(){
		if (this.getBestellung()==null) return null;
		return this.getBestellung().toString();
	}
	
	

}

Die Knoten funktionieren auch einwandfrei. Das Problem liegt jetzt aber in der Klasse der eigentlichen implementierten verketteten Liste. Ich habe in dieser Klasse eine Methode zum Anzeigen aller verfügbaren Bestellungen erstellt:

Java:
public Bestellung[] getAllData(){
		int anz=anzKnoten;
		if(anz==0) return new Bestellung[0];
		Bestellung[] best=new Bestellung[anz];
		best[0]=wurzel.getBestellung();
		Knoten k=wurzel.getNaechster();
		for(int i=1; i<anz; i++){
			best[i]=k.getBestellung();
			if(k!=null) k=k.getNaechster();
		}
		return best;
	}

In der Main-Methode habe ich nun eine doppelt verkettete Liste erstellt und die Liste mit Bestellungen "befüllt". Jetzt wirft die Methode beim Start immer eine NullPointerException. Kann mir da jemand behilflich sein?

Ich freue mich auf eure Antworten!
Danke im Voraus! 😱
 
Zuletzt bearbeitet von einem Moderator:
Dann poste doch mal die Fehlermeldung und den zu der Meldung gehörenden Code.

Übrigens: Java-Code bitte in Java-Tags setzen und gescheit einrücken!

Gruß Fant
 
Danke für die schnelle Antwort! Das mit dem Java-Code tut mir leid, ich hatte das erst nach meinem Post gelesen!

Das hier ist die Fehlermeldung:
Java:
Exception in thread "main" java.lang.NullPointerException
	at listen.DoppeltVerketteteListe.getAllData(DoppeltVerketteteListe.java:48)
	at listen.TestListe.main(TestListe.java:17)

Dazu noch die Code-Zeilen:

Zeile 48 aus der Klasse 'DoppeltVerketteteListe':
Java:
best[i]=k.getBestellung();

Zeile 17 aus der Klasse 'TestListe':
Java:
System.out.println(d.getAllData());
 
Und wie sieht DoppeltVerketteteListe.java aus?

Java:
best[i]=k.getBestellung();
if(k!=null) k=k.getNaechster();
Wenn k bereits vor dem if null ist, gibt es bei k.getBestellung() eine NullPointerException.
 
Vermutlich ist k null, wenn du versuchst darauf zuzugreifen.

Eventuell reicht es schon aus die Prüfung auf Null für beide Code-Zeilen in der for-Schleife zu verwenden.

Java:
for(int i=1; i<anz; i++){
    if(k!=null) {
        best[i]=k.getBestellung();
        k=k.getNaechster();
    }
}

Musst du mal schauen, ob es dann wirklich noch exakt das macht, was du möchtest.
 
Okay ich habe den Code nun wie folgt verändert:

Java:
for(int i=1; i<anz; i++){
    if(k!=null) {
        best[i]=k.getBestellung();
        k=k.getNaechster();
    }
}

Und kriege nun die folgende Ausgabe:

Java:
[Llisten.Bestellung;@705789f3
 
Es wäre wesentlich einfacher, dir zu helfen, wenn du mit deinem Quellcode nicht so sparsam umgehen würdest.
Java:
return this.getBestellung().toString();
Wie sieht die toString-Methode der Klasse Bestellung aus?
 
Die toString()-Methode hab ich in der Bestellung-Klasse überschrieben:

Java:
public String toString(){
		return "Bestellung-ID: " + getId() + 
			   "\nBezeichnung: " +getBez() +
			   "\nPriorität: " +getPrio();
	}
 
Du hast nun aber kein Objekt Bestellung, sondern ein Array. Schreib dir noch eine passende Methode, um das Array von Bestellungen auszugeben.

Gruß Fant
 
Aber getAllData() liefert dir doch ein Array zurück. Versuch es probeweise einmal mit:
Java:
System.out.println(Array.toString(d.getAllData()));

EDIT: Immer eine Minute zu langsam. :/
 
Das geht bei Arrays leider nicht. Wenn du nen Array
Code:
objekte
hast, und du das per
Java:
System.out.println(objekte)
ausgibst, dann wird die toString() Methode deiner Klasse nicht aufgerufen! Ist unschön, ist aber so. Du musst es dann so ausgeben:
Java:
System.out.println(Arrays.toString(objekte));
 

Zurück
Oben