Seite 1 von 2

Übung 9

Verfasst: 13. Jun 2012 16:48
von wambo
Halli Hallo,

ich komme einfach nicht drauf was falsch ist, beim ausführen der test-Methode aus der Klasse Josephus, erhalte ich den Fehler "java.lang.NullPointerException at Circle.insert (Circle.java:55)"
(Es wird auch die Josephus.test genannt, aber diese ruft in der Zeile nur die insert-Methode auf)
Meine insert Methode:

Code: Alles auswählen

public void insert(int number) {
        
        Person neu = new Person(number, start);
        if (isEmpty()) start = neu;
         
        else {
                Person current = start;
                while ( current.next() != start){
                    current = current.next();
                }
                current.setNext(neu);
            }
        }
Zeile 55 ist die "while (current.next() !=start){ "

Ich komm nicht drauf was daran falsch ist:
- Wenn der Kreis leer ist (Abfrage in If Bedingung), dann wird die neue Person (die als nächsten sowieso 'start') hat, direkt auf den platz von 'start' geschrieben, weißt damit auf sich selbst.
- Beim nächsten insert, laufe ich von der Person 'start' so lange zur nächsten Person, bis die nächste Person 'start' ist, beim Nr. 2 würde die Schleife also kein mal durchlaufgen, udn direkt die neue person als Nächster von 'start' gesetzt,


Wo liegt mein Fehler?

Re: Übung 9

Verfasst: 13. Jun 2012 16:53
von Owyn
Hallo,

der Fehler liegt in den ersten beiden Zeilen.

Die neue Person wird mit start als Nachfolger erzeugt.
Wenn der Kreis leer ist, ist start aber noch null, in diesem Fall müsste also auch der Nachfolger der neuen Person neu gesetzt werden.

Gruß,
Christian Heinig

Re: Übung 9

Verfasst: 13. Jun 2012 21:01
von wambo
Ah, es liegt also daran, dass ich start erst "fülle" nachdem ich start schon als Nachfolger benutzt habe...

Wenn ich also
start = new Person (number, start) in die if klausel setzen würde, sollte es funktionieren....

dann muss ich natürlich die Person neu, in die else-Klammer reinschieben....

oke, vielen Dank, ich bin wirklich nicht drauf gekommen...
--- edit: ---
Er meckert immer noch an der while schleife rum :-/
Oke, ich darf nicht start beim deklarieren von start benutzen....

Re: Übung 9

Verfasst: 13. Jun 2012 21:08
von Owyn
In Ihrer neuen Version klappt es immer noch nicht, denn in folgendem Statement:
start = new Person(number, start);
wird erst die rechte Seite ausgewertet, und da ist start noch null!

Das Erzeugen der neuen Person kann ruhig wie in der ersten Version vor der if-Bedingung erfolgen.

Wenn der Kreis allerdings noch leer ist, muss nicht nur der start auf die neue Person gesetzt werden, sondern anschließend noch der Nachfolger der neuen Person auf start gesetzt werden - dafür gibt es ja die Funktion setNext...

Gruß,
Christian Heinig

Re: Übung 9

Verfasst: 13. Jun 2012 21:59
von wambo
Hab es schon gemerkt, nur den edit nicht abgeschickt.

Vielen Dank, nochmals, sogar Hilfe während Deutschland spielt ! XD

Re: Übung 9

Verfasst: 13. Jun 2012 22:12
von Owyn
Ist ja nur Fußball.

Gruß,
Christian Heinig

Re: Übung 9

Verfasst: 6. Jul 2012 19:21
von Johnny
Ich bin gerade jetzt bei der Übung 9, und habe ein sehr komisches Problem: Wenn ich den Konstruktor für eine der Unterklassen von Locomotive aufrufe, wird der Konstruktor von Locomotive aufgerufen. Ich habe versucht, ein Konstruktor mit Parameter zu erzeugen, der klasseneigene private Variablen anwendet, aber der Konstruktor von Locomotive wird immer noch aufgerufen. Muss ich vielleicht den Konstruktor so anwenden, dass der Locomotive-Konstruktor sinnvoll eingerufen werden kann?

Re: Übung 9

Verfasst: 6. Jul 2012 19:34
von Owyn
Im Konstruktor einer Unterklasse wird immer der Standard-Konstruktor der Überklasse aufgerufen, wenn Sie nicht selbst mittels "super" als erstes einen passenden Konstruktor der Überklasse aufrufen. Das wäre also ein gangbarer Weg...

Gruß,
Christian Heinig

Re: Übung 9

Verfasst: 7. Jul 2012 10:38
von Johnny
Da ich nie nur ein einziges Problem habe, gibt mir auch die Methode remove der Klasse Circle Schwierigkeiten. Um die Analogie aus der Aufgabenstellung zu benutzen, wenn ich versuche, Y zu entfernen, der sich zwischen X und Z befindet, setze ich Z als der Nachfolger von X statt Y. Die Fehlermeldung sagt, dass ich einen Wert statt einer Variablen einsetze. Die Code-Stelle lautet so:

X.next()=X.next().next();

Re: Übung 9

Verfasst: 7. Jul 2012 13:46
von snejjj
x.next() liefert einen Wert der Variablen, die das nächste objekt speichert. Du möchtest aber die Variable ansprechen, dafür bräuchtest du entweder eine setter-Methode (z.B. setNext(//Wert hier), falls sowas definiert ist) oder du musst die Variable direkt ansprechen x.Variablenname = ...

Re: Übung 9

Verfasst: 2. Aug 2012 15:57
von DasKlavier
Ich habe noch eine zusätzliche Frage zu der Übung 9 der ersten Aufgabe. Bei der Methode public void insert(int number) kann man sich das ja so vorstellen : Der letzte vor start bekommt einen neuen Nachfolger ich hatte es erst so gemacht ,dass ich einen neuen Nachfolger kreiert habe.

Code: Alles auswählen

 else {
          Person nachfolger = new Person(number,start);
          Person current = start;
        while (current.next() != start) {
	      current = current.next();
	   }
	    
	   current.setNext(nachfolger)); } 
In der Musterlösung ist es ja einach folgendermaßen gelöst mit

Code: Alles auswählen

current.setNext(new Person(number, start))
Der next Wert von current wird dann quasi einfach neu gesetzt mit der setNext-Methode und das neue Objekt kriegt keinen Namen. Kann mir das nochmal erklären was da genau intern passiert ? Ich hatte mir das so vorgestellt : die Schleife geht bis zum Letzten durch und stoppt dann. Jetzt hab ich quasi den Letzten in current gespeichert und ändere seinen Pfeil quasi auf den nachfolger ,welcher quasi paralell auch auf start zeigt. Den ich oben neu deklariert hatte.?!

Re: Übung 9

Verfasst: 2. Aug 2012 17:46
von mmec
Das hier ist ein Teil der Musterlösung:

Code: Alles auswählen

        } else {
            Person current = start; // Vom Start...
            while (current.next() != start) current = current.next(); //...bis direkt vor dem Start abzaehlen
            current.setNext(new Person(number, start)); // Neue Person zwischen letzter und erster Person einfuegen
        }
    }
Und das ist deine Lösung:

Code: Alles auswählen

 else {
          Person nachfolger = new Person(number,start);
          Person current = start;
        while (current.next() != start) {
         current = current.next();
      }
       
      current.setNext(nachfolger)); }
Die machen doch beide das gleiche, nur dass du vorher nochmal eine Variable für den Nachfolger erstellt hast.

Ja das funktioniert so wie du es erklärt hast. Ein Person Objekt gibt dir ja immer ein Nachfolger, also musst du nur die Person finden die als Nachfolger start hat. Dann setzt du als Nachfolger des letzten Objekts ein neues Objekt. Und dieses neue Objekt soll als Nachfolger start haben.

vorher: -- -> letzter -> start -> --

nachher:-- -> letzter -> neues Objekt -> start -> --


Grüße, Johannes

Re: Übung 9

Verfasst: 28. Aug 2012 13:18
von combs
Hallo;
ich hätte eine Frage bei der Methode INSERT. woher weißt man das unseren kreis bis zu der letzten Personn durchgelaufen wird.??..Wenn man kreis z.b 10 Personn enthalten würde, wäre die "While-Bedingung" auch bei der Personne 2 oder 3 schon "wahr".

else {
Person current = start; // Vom Start...
while (current.next() != start) current = current.next();
current.setNext(new Person(number, start));
}

Re: Übung 9

Verfasst: 28. Aug 2012 13:29
von Owyn
Ja, natürlich - die while-Schleife läuft aber nicht, BIS die Bedingung zutrifft, sondern, SOLANGE sie zutrifft.
Also bis die Bedingung eben nicht mehr zutrifft bzw. bis der Nachfolger des aktuell betrachteten Elements das Startelement ist.

Gruß,
Christian Heinig

Re: Übung 9

Verfasst: 28. Aug 2012 14:30
von combs
Aso Danke, das bedeutet jeder "next" der nicht "start" ist, wird als "start" gesetzt aber mit der information ""number""(Übergabe)....

Gruß,
Patrick