Überschreiben der clone()-Methode

Miramizu

Mitglied
Huhu

Ich hab eine Frage: Wieso funktioniert meine clone()Methode nicht?

Kennt sich da wer aus?

Es geht hier um eine SLL (Single Linked List) ich poste mal nur die Methode, die anwendung und den laufzeitfehler, wenn das komplette programm nötig ist, bitte bescheid sagen, aber ich denke es ist daraus zu erschließen. die anderen methoden (getters und setters und so) funktionieren alle einwandfrei. und es lässt sich ja auch kompilieren. Viellecht kann mir ja wer helfen hier die Methode:

Java:
@Override
	public SLL clone() {
		Node pointer = top;
		SLL listClone = new SLL();
		Node clone = pointer;
		while (pointer.getNext() != null) {
			pointer = pointer.getNext();
			clone.setNext(pointer);

			if (pointer.getNext() == null) {
				pointer = pointer.getNext();
				clone.setNext(null);
			}

		}

		return listClone;
	}

anwendung:
Java:
System.out.println("KLonen:" + list.clone());

Fehler:

Exception in thread "main" java.lang.NullPointerException
at de.fhalbsig.win.sll.SLL.clone(SLL.java:89)
at SLLApp.main(SLLApp.java:47)


SLLApp Zeile 47 ist die vorher gepostete, also system.out... ... In Zeile 89 steht:
Java:
		while (pointer.getNext() != null) {

Versteht jemand das Problem?

Vielen Dank im Vorraus 🙂
 
Code:
poiner
scheint
Code:
null
zu sein, aber was soll das da überhaupt werden? Du machst mit
Code:
listClone
ja gar nichts oder? ;/


(Ein ziemlich einfacher Trick etwas zu clonen wäre Serializable btw)
 
In Zeile 11 setzt du pointer auf null. Beim nächsten Schleifendurchlauf bei pointer.getNext() knallt es dann.
 
doch doch ich will eine kopie einer liste erstellen... die liste ist in der SLLApp bereits erstellt worden, dann geb ich sie aus, setz da was hin, oder dort ein element lösch was und alles funktioniert immer mit dieser while schleife... und jetzt plötzlich nicht.

und ich versteh auch nicht dass ich den auf null setze... ich sitz schon seit heute mittag an dem programm vll bin ich mittlerweile auch blind aber ich verstehe das nicht...

habt ihr ne lösung? oder nen lösungsansatz wie ich das verhindere, dass der auf null geht? soll ich doch die komplette codes (sind drei klassen: SLL, Node und SLLApp) posten?
 
und ich versteh auch nicht dass ich den auf null setze...

Java:
     if (pointer.getNext() == null) {
                pointer = pointer.getNext();

Du fragst hier ab ob getNext() null liefert, wenn ja, setzt du pointer auf getNext() (Erinnerung: getNext() ist null) ..die while-Schleife prüft dann wieder ihre Bedingung mit pointer.getNext() und es kracht !
 
Hier setzt du pointer auf null:
Java:
if (pointer.getNext() == null) {
                pointer = pointer.getNext();
 ...}

Außerdem machst du wie gesagt nichts mit listClone. Das Objekt wird am Ende einfach so zurück gegeben. Die Schleifen haben überhaupt keinen Einfluss. Außerdem musst du auch die Nodes clonen und in das neue SSL-Objekt setzen.
 
aaah jetzt danke... okay ich hab kapiert dass ich den auf null setze... also gut wenn die schleifen nichts machen sind sie wohl unnötig...

hat denn vielleicht jemand einen anderen lösungsansatz, wie man so ne liste klonen könnte? kann man sich nicht irgendwie mit der get-methode die werte holen und ausgeben? da bräuchte man aber auch wieder ne schleife oder? oder gibts vll eine viel viel einfachere lösung...

hat jemand ne idee?
 
Naja an sich haben wir dir ja jetzt schon zwei Varianten aufgezählt.
Man könnte Node + SLL (+ evtl. weitere) Serializable implementieren lassen und dann eben die Liste einfach Serialisieren, Deserialisieren (mit ByteArrayOutputStream z.B.) und zurückgeben oder eben so ähnlich wie du jetzt auch schon gemacht hast, eben Iterieren. Aber du musst dann natürlich wie tfa schon schrieb die Nodes auch klonen, sonst hast du eben keine echte tiefe Kopie und du musst die Nodes natürlich dann der Liste bekannt machen. Im Moment erstellst du ein Listobjekt und gibst das zurück, das ist quasi nackt 🙂
Wir kennen jetzt deine Listimplementierung nicht, aber wenn du dir z.B. nur den Listanfang merkst, musst du eben den ersten Node in deiner Liste dann setzen. Der Rest ergibt sich ja dann von selbst Node 1 --> Node2 -> usw....
 
Tut mir leid, ich bin doch noch weit mehr am Anfang als ich dachte. Ich hab keine Ahnung was iterieren und serialisierne und serialziable ist. Das klingt extrem kompliziert ich habe keine ahnung, wie ich das jetzt implementieren könnte absolut nicht.

Aber ich geh die Tage zu meinen Java-"nachhilfelehrer" und zeig ihm deine beschreibung, vielleicht kann er das umsetzen. weil ich versteh grad echt nicht wirklich viel davon, und es wäre zuviel verlangt, das jetzt auch noch in anfängersprache umzuwandeln denke ich...

ich schreib hier natürlich wie es gelaufen ist, vielleicht setz ich mich morgen auch noch mal dran. Also das sind die einzigen beiden Varianten?

Schade, dachte eigentlich es geht viel einfacher... Also ohne die Nodes mitzukopieren wie so ein befehl von wegen sll.clone() und es is dann automatisch geklont. also das java selbst so etwas anbietet, hab aber auch nichts in der richtung gefunden :/

Also Vielen Dank mal, ich halt euch auf laufenden ob ichs dann irgendwann schaffe 🙂
 
Naja, du könntest vllt. auch noch ein paar Mehr Informationen geben. Was genau steckt in Node?(eine Referenz auf einen anderen Node, das ist klar, aber vom Inhalt her, Strings? Zahlen? Oder ist das generisch? Wenn da etwas nicht serialisierbares drin stecken soll, fällt diese Variante nämlich natürlich schon einmal raus)
Und vllt. sollst du ja auch gar keine tiefe Kopie liefern sondern wirklich nur eine Flache (dann wäre deine Version ja schon gar nicht so falsch *g*)?? Die verkettete Liste aus dem JDK liefert ja auch nur eine shallow copy!
 
DAS steckt in Node:

Java:
public class Node {
	private int data;
	private Node next;

	public Node() {

	}

	public Node(int data) {
		this.data = data;
	}

	public Node(int data, Node next) {
		this.data = data;
		this.next = next;
	}


und die getters und setters aber die muss ich ja nicht posten, die sind ja klar.

ändert das jetzt was?


EDIT: also is das jetzt serialisierbar?

Und ja ich denk eine flache reicht. es kommt wirklich nur auf die Ausgabe an.

Wenn ich jetzt sag list.print();
soll das gleiche rauskommen wie:
list.clone();

so hab ichs zumindest verstanden... und so will ichs auch machen.
 

Zurück
Oben