Collections Verkettete Listen und Fußball...

dudsen

Mitglied
Hi,

Habe wieder mal ein Problem mit einer Verketteten Liste zur Klausurvorbereitung.
Ich bekomme bei meiner insert() Methode eine Null Pointer Exception, und verstehe einfach nicht warum.

Gegeben ist eine vorher erstellte verkettete Liste die mit Namen und erzielten Toren so aussieht:

Klose 14-->Rahn 10-->Beckenbauer 5-->Conen 4 -->null

Die Klasse mit Methoden:

Java:
public class WMListe {
	private Spieler spieler;	//data of 1 element
	private WMListe next;		//pointer to the following object
	WMListe first;			//points to the head of list
	WMListe oldfirst;

	public WMListe(Spieler s) {
	spieler = s;
	next = null;
	}
	
	public WMListe(String datei) {
		first = null;
		oldfirst = null;
	
		In input = new In(datei);
		
		while(!input.isEmpty()){
			String name = input.readString();
			int tore = input.readInt();
			spieler=new Spieler(name,tore);
			
			if(first==null){
				first=new WMListe(spieler);
				first.next=null;
			}
			else{
				oldfirst=first;
				first=new WMListe(spieler);
				first.next=oldfirst;
			}
			
			
		}
	}
	
	public static WMListe insert(WMListe liste, Spieler s){
		WMListe current=liste;
		WMListe insert=new WMListe (s);
		
		while(current!=null){
			if(s.getTore()>=liste.spieler.getTore()){
				insert.next=liste;
				liste=insert;
			}
			// Zeile 131, hier meckert er rum mit einer Null Pointer Exception
			else if(s.getTore()<current.spieler.getTore() && s.getTore()>=current.next.spieler.getTore()){
				insert.next=current.next;
				current.next=insert;
			}
			else if(s.getTore()<current.spieler.getTore() && current.next==null){
				current.next=insert;
			}
			current=current.next;
		}
		return liste;
	}
	
	
		
	public String toString(){
	String s = "";

		//1) reversing the current list
		WMListe current=first;
		WMListe previous=null;
		WMListe forward;
		
		while(current!=null){
			forward=current.next;
			current.next=previous;
			previous=current;
			current=forward;
		}
		
		//concats the current list to a String
		for(WMListe x=previous;x!=null;x=x.next){
			s+=x.spieler + "\n";
		}
		
		return s;
	}
	
	

	//zum testen
	public static void main(String[] args) {
		
		String datei= "Spielerdaten.txt";
		WMListe liste= new WMListe(datei);
		
		Spieler klinsi= new Spieler ("Kliensmann",11);
		liste=insert(liste,klinsi);
		
		System.out.print(liste);
		

	}
	
}

Und noch die Klasse Spieler:
Java:
public class Spieler { 
        String name;	// Name des Spielers 
	int tore;	       // Anzahl der Tore

	public Spieler(String name, int tore) {
		this.name = name;
		this.tore = tore;
	} 
	
	public String getName() {
		return name;
	}
	
	public int getTore() {
		return tore; 
	}
	
	public String toString() {
		return name + " Tore:" + tore;
	}
}

Und das Erbrochene der Konsole:

Exception in thread "main" java.lang.NullPointerException
at WMListe.insert(WMListe.java:132)
at WMListe.main(WMListe.java:178)


Ich blicks nicht. Finde keinen Fehler in der insert Methode. Warum sollte current.next auf Null Zeigen? Ist doch am Anfang auf das Selbe Objekt wie Liste gesetzt? Oder hab ich mal wieder einen offensichtlichen Denkfehler?

Für Hilfe sehr Dankbar :)

.d
 
Zuletzt bearbeitet:

Guardi

Bekanntes Mitglied
next = null;

current.next ist demzufolge auch null.

Und setzen tust du die Variable nirgends, in deinem geposteten Code...
 

Marco13

Top Contributor
Nur kurz überflogen:
// Zeile 131, hier meckert er rum mit einer Null Pointer Exception
else if(s.getTore()<current.spieler.getTore() && s.getTore()>=current.next.spieler.getTore()){

Ich nehme an, "current.next" ist null (üblicherweise am Ende der Liste...)
 

Guardi

Bekanntes Mitglied
Finde die Implementierung auch etwas fragwürdig.
insert sollte eine Methode auf einem Listen-Objekt sein, nicht unbedingt statisch.
Klar das funktioniert so, ist aber nicht sonderlich schön.
Die Sichtbarkeiten der Member-Variablen sind demzufolge auch ein No-Go.

Eine Sortieren-Funktion hingegen kannst du statisch auslagern, da diese nur das Objekt modifizieren soll.

Die Vorteile sind einfach eine erheblich bessere Übersichtlichkeit.
Als Anfänger neigt man dazu alles in große unübersichtliche Code-Blöcke zu packen, war bei mir ja auch so.
Versuche immer in "Problemen" zu denken. Eine Methode für ein Problem.
 

dudsen

Mitglied
Danke schonmal für die fixen Antworten,

OK, war ein wenig unglücklich nicht die ganze Klasse zu Posten... Eintrag wurde oben überarbeitet.
next pointet eigentlich nicht auf null, das ist beim anlegen der Liste ( siehe zweiten Konstruktor) jeweils festgelegt.

Ausgabe auf der Konsole ist ebenfalls richtig, also stimmen die jeweiligen next pointer.
Denke ich doch mal.

Mit den Festlegungen in der insert_Methode:

WMListe current=liste;

...

else if(s.getTore()<current.spieler.getTore() && s.getTore()>=current.next.spieler.getTore()){

Sollte es doch normalerweise gehen oder nicht?

Hoffentlich kann jemand mir mein Brett vorm Kopf wegnehmen. Das nervt :rtfm:

.d
 

dudsen

Mitglied
Hehe,

habe so die Vorahnung das ich dir ins Messer laufe.

Nach meinem Verständnis passiert das im Konstruktor. Um genau zu sein im Zweig der if-Anweisung:

oldfirst=first;
first=new WMListe(spieler);
first.next=oldfirst;

Dort werden doch den jeweiligen "next" Variablen der Objekte das darauf folgende zugewiesen.
Also mit first.next=oldfirst;

Ja? Ne?
 

Shulyn

Bekanntes Mitglied
Aufpassen.
Java:
else if(s.getTore()<current.spieler.getTore() && s.getTore()>=current.next.spieler.getTore()){

Gehen wir davon aus du hast folgende Liste (ohen SpielerNamen) :

8 Tore / 5 Tore / 2 Tore / null

Jetzt willst du 1 Spieler mit 1 Tor einfügen... läufst einige mal durch deine schleifen und kommst zu folgendem Stand:

current = 2 Tore!
jetzt befüllen wir einmal dein IF :
Code:
if(s.getTore()<current.spieler.getTore() && s.getTore()>=current.next.spieler.getTore()){
if(  1         <            2                  &&       1     >=   2 hat keinen nachfolger..next ist nulll ){
gemerkt?

nebenbei wozu braucht man "oldFirst" ???:L

Gehen wir davon aus du hast "nur" First.
So würde folgender code ausreichen :
Code:
neuerEintrag.next = first;
first = neuerEintrag;

OldFirst wär somit überflüssig.
Auch verstehe ich das Design deiner Liste nicht ganz.
Wenn man es Bildlich beschreibt, so ist deine Liste ein Buch mit 1 Seite.
Und immer wenn du etwas "hinzufügen" willst, so packst du 1 neues Buch mit 1 Seite in dein Buch...

Wie wäre es die WmListe als "kopf" zu verwenden, wo nur die Referenz auf z.B. den 1. und den letzen eintrag enthalten sind. Natürlich mit allen wichtigen Methode. So würdest du es dir ersparen immer ein neues Buch in das Buch zu legen...

Code:
Buch -> Zeigt auf Seite 1 
Buch -> Zeigt auf die letzte Seite

Seite -> Enthält 1 Spieler
Seite -> Zeigt auf nächste Seite

Spieler -> Steht auf 1 Seite
 
Zuletzt bearbeitet:

Guardi

Bekanntes Mitglied
Java:
    public WMListe(String datei) {
        first = null;
        oldfirst = null;
    
        In input = new In(datei);
        
        while(!input.isEmpty()){
            String name = input.readString();
            int tore = input.readInt();
            spieler=new Spieler(name,tore);
            
            if(first==null){
                first=new WMListe(spieler);
                first.next=null;
            }
            else{
                oldfirst=first;
                first=new WMListe(spieler);
                first.next=oldfirst;
            }
            
            
        }
    }

first ist immer null. Deswegen funktioniert das hier auch nicht bzw. else Block wird nie aufgerufen.

Nochmal was anderes:
Mein Vorposter hat schon recht. Wenn du eine verkettete Liste baust so definiere ein Element mit prev, next Variablen.
Die Listen-Klasse muss nur "first" kennen. Jede Klasse Element kennt seinen Vorgänger und Nachfolger. Ein Element hat dann in deinem Fall einen Spieler und prev auf voriges Element mit Spieler sowie next auf nächstes Element mit Spieler.

Java:
public class MyElement{

private Spieler spieler;
private MyElement next;
private MyElement prev;

...dein Code...

}
 
Zuletzt bearbeitet:

dudsen

Mitglied
Sooo, danke nochmal ihr 2 für die investierte Zeit.

100%ig klar ist es immer noch nicht, aber besser als gestern.

first ist immer null. Deswegen funktioniert das hier auch nicht bzw. else Block wird nie aufgerufen.

Nope. in der ersten if-Verzweigung wird first ein Spieler zugewiesen, sodass bei dem 2ten Durchlauf der while Schleife der else Zweig ausgeführt wird. Der Konstruktor funktioniert ja auch soweit und die Liste wird auch ausgegeben.

Mit der prev- Variable ist definitiv besser,da hast du Recht. hab ich bei einer anderen Aufgabe auch mal eingebaut.

Ich probier nochmal das ganze neu zu implementieren. Meine Kommolitonen haben heute auch gemeint das dieser Teil der Aufgabe mit den Auflagen der Hass war.

Anyway, danke

Ich setz mich nochmal davor :rtfm:

laterssssss
 
T

TestUser123123

Gast
Ich würde noch mehr Aufgaben dieses Profs Online stellen....
Dadurch werden sicher die Klausuren immer leichter....MANN MANN MANN
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Einfach-Verkettete-Listen Ausgabe zeigt nur 1. und letzte instanz Java Basics - Anfänger-Themen 2
V einfach verkettete Listen Java Basics - Anfänger-Themen 10
A Was könnten typische Prüfungsaufgaben zum Thema lineare, verkettete Listen sein? Java Basics - Anfänger-Themen 5
N verkettete Listen Java Basics - Anfänger-Themen 4
M verkettete Listen Java Basics - Anfänger-Themen 1
V Methoden Verkettete Listen Index eines Elementes ausgeben Java Basics - Anfänger-Themen 10
S Verkettete Listen Java Basics - Anfänger-Themen 10
S Verkettete Listen in Java Java Basics - Anfänger-Themen 11
C Methoden Verkettete listen - next methode Java Basics - Anfänger-Themen 3
I verkettete listen Java Basics - Anfänger-Themen 12
K verkettete Listen - Klasse Knoten Java Basics - Anfänger-Themen 19
U Verkettete Listen Java Basics - Anfänger-Themen 13
M Probleme mit verkettete Listen Java Basics - Anfänger-Themen 4
M verkettete Listen Java Basics - Anfänger-Themen 39
T Klasse in Java für doppelt verkettete Listen Java Basics - Anfänger-Themen 4
I verkettete listen Java Basics - Anfänger-Themen 5
H Doppelt verkettete Listen Java Basics - Anfänger-Themen 2
S doppelt verkettete Listen Java Basics - Anfänger-Themen 4
X Vererbung: Doppelt verkettete Listen Java Basics - Anfänger-Themen 16
M Verkettete Liste Java Basics - Anfänger-Themen 1
H Java verkettete Liste, Wert eines Index zurückgeben Java Basics - Anfänger-Themen 1
Igig1 Autoparkplatz verkettete Liste erstes und letztes Auto Java Basics - Anfänger-Themen 13
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
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
Y Einfügen in eine doppelt verkettete Liste Java Basics - Anfänger-Themen 8
A Doppelt verkettete Liste rückwärts ausgeben Java Basics - Anfänger-Themen 17
D Doppelt Verkettete Zirkular-Liste Java Basics - Anfänger-Themen 1
A Verkettete Liste Java Basics - Anfänger-Themen 2
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
R Methoden Entferne alle identische Knoten (Typ String) aus verkettete Liste Java Basics - Anfänger-Themen 8
C Methoden Über eine einfach verkettete Liste Java Basics - Anfänger-Themen 8
H Verkettete Liste Java Basics - Anfänger-Themen 7
N Verkettete liste rückwärts ausgeben Java Basics - Anfänger-Themen 18
K Verkettete Liste und seine Methoden Java Basics - Anfänger-Themen 1
N Verkettete Liste implementieren Java Basics - Anfänger-Themen 5
O Einfach verkettete Liste - Revert Methode Java Basics - Anfänger-Themen 1
G Verkettete Liste - Neu erzeugte Elemente werden nicht ausgegeben Java Basics - Anfänger-Themen 5
S Einfach verkettete Liste Element an bestimmter Position einfügen Java Basics - Anfänger-Themen 24
B Doppelt Verkettete Liste - Ist alles gut so? Java Basics - Anfänger-Themen 3
C Verkettete Liste - sortiert einfügen Java Basics - Anfänger-Themen 7
R Erste Schritte Verkettete Liste will einfach nicht in meinen Schädel Java Basics - Anfänger-Themen 11
B in einem abstrakten Set ,Elemente einer einfache verkettete List epeichern Java Basics - Anfänger-Themen 13
U Datentypen Doppelt verkettete Liste implementieren Java Basics - Anfänger-Themen 13
J Methoden Doppelt verkettete Liste remove(Object) Java Basics - Anfänger-Themen 8
B OOP Über eine doppelt verkettete Liste iterieren Java Basics - Anfänger-Themen 4
hooked Verkettete Liste / linked list Java Basics - Anfänger-Themen 2
L Doppelt verkettete Liste Java Basics - Anfänger-Themen 6
J Eine Art verkettete Liste aber mit teils mehr als einem Nachfolger Java Basics - Anfänger-Themen 8
V Verkettete Liste rückwärts ausgeben Java Basics - Anfänger-Themen 3
R doppelt verkettete Liste aus Arrays erstellen Java Basics - Anfänger-Themen 1
K Einfach Verkettete Liste - addFirst() Java Basics - Anfänger-Themen 7
G 2 Aufgabe rund um eine verkettete Liste Java Basics - Anfänger-Themen 2
O Verkettete Liste Java Basics - Anfänger-Themen 10
E Methoden auf von Methoden erstellte Objekte zugreifen (verkettete Liste) Java Basics - Anfänger-Themen 10
X Einfach verkettete Liste, keine Fehlermeldung Programm friert ein Java Basics - Anfänger-Themen 4
S Doppelt verkettete Liste Java Basics - Anfänger-Themen 3
G Doppelt Verkettete Liste Java Basics - Anfänger-Themen 2
A Doppelt Verkettete Liste Java Basics - Anfänger-Themen 16
E doppelt verkettete liste Java Basics - Anfänger-Themen 10
V Verkettete Liste. Java Basics - Anfänger-Themen 7
X Einfach Verkettete Liste Java Basics - Anfänger-Themen 16
K Verkettete Liste - Methode entwerfen Java Basics - Anfänger-Themen 14
S Verkettete Liste rückwärts ausgeben Java Basics - Anfänger-Themen 12
B Insertionsort verkettete Liste Java Basics - Anfänger-Themen 4
B Stack in eine verkettete Liste pushen Java Basics - Anfänger-Themen 4
R verkettete liste ansEndeSchieben Java Basics - Anfänger-Themen 13
T Verkettete Liste Java Basics - Anfänger-Themen 14
A Klassen Innere Klassen, verkettete Liste Java Basics - Anfänger-Themen 9
B Zweifach-verkettete Liste umkehren Java Basics - Anfänger-Themen 6
X verkettete Liste Java Basics - Anfänger-Themen 13
E Datentypen Doppelt verkettete Liste Java Basics - Anfänger-Themen 10
P Einfügen in doppelt verkettete Liste Java Basics - Anfänger-Themen 7
kae verkettete Liste Java Basics - Anfänger-Themen 5
S Queue als doppelt verkettete Liste Java Basics - Anfänger-Themen 2
S Stack als verkettete liste/ toString methode Java Basics - Anfänger-Themen 3
B OOP Verkettete Liste Java Basics - Anfänger-Themen 7
R verkettete liste Java Basics - Anfänger-Themen 5
M Verkettete Liste Java Basics - Anfänger-Themen 4
M verkettete liste Java Basics - Anfänger-Themen 7
N doppelt verkettete liste einfügen Java Basics - Anfänger-Themen 7
K Datentypen Einfach/Doppelt verkettete Liste Java Basics - Anfänger-Themen 4
N einfach verkettete liste fehler Java Basics - Anfänger-Themen 5
N einfach verkettete liste Java Basics - Anfänger-Themen 3
G verkettete Liste - invertieren Java Basics - Anfänger-Themen 2
B OOP Einfach verkettete Liste - rekursive Methoden Java Basics - Anfänger-Themen 1
B verkettete Liste Java Basics - Anfänger-Themen 8
S zyklisch verkettete Liste erstellen Java Basics - Anfänger-Themen 3
S einfach verkettete Liste Java Basics - Anfänger-Themen 19
O Stack Implementierung als verkettete Liste Java Basics - Anfänger-Themen 8
W Doppelt verkettete Liste implementieren Java Basics - Anfänger-Themen 2
T Einfach verkettete Liste: Wie Elemente löschen? Java Basics - Anfänger-Themen 4
J verkettete Liste Java Basics - Anfänger-Themen 2
D Einfach verkettete Liste Java Basics - Anfänger-Themen 20
DasDogma Verkettete Liste - Element löschen Java Basics - Anfänger-Themen 2
H Verkettete Liste Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben