Übung 9

wambo
Windoof-User
Windoof-User
Beiträge: 25
Registriert: 20. Feb 2012 09:19

Übung 9

Beitrag von wambo » 13. Jun 2012 16:48

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?

Benutzeravatar
Owyn
BSc Spammer
BSc Spammer
Beiträge: 1012
Registriert: 5. Sep 2005 21:53
Wohnort: Rheingau

Re: Übung 9

Beitrag von Owyn » 13. Jun 2012 16:53

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
All those who believe in psycho-kinesis, raise my hand.
(Steven Wright)

wambo
Windoof-User
Windoof-User
Beiträge: 25
Registriert: 20. Feb 2012 09:19

Re: Übung 9

Beitrag von wambo » 13. Jun 2012 21:01

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....
Zuletzt geändert von wambo am 13. Jun 2012 21:55, insgesamt 1-mal geändert.

Benutzeravatar
Owyn
BSc Spammer
BSc Spammer
Beiträge: 1012
Registriert: 5. Sep 2005 21:53
Wohnort: Rheingau

Re: Übung 9

Beitrag von Owyn » 13. Jun 2012 21:08

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
All those who believe in psycho-kinesis, raise my hand.
(Steven Wright)

wambo
Windoof-User
Windoof-User
Beiträge: 25
Registriert: 20. Feb 2012 09:19

Re: Übung 9

Beitrag von wambo » 13. Jun 2012 21:59

Hab es schon gemerkt, nur den edit nicht abgeschickt.

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

Benutzeravatar
Owyn
BSc Spammer
BSc Spammer
Beiträge: 1012
Registriert: 5. Sep 2005 21:53
Wohnort: Rheingau

Re: Übung 9

Beitrag von Owyn » 13. Jun 2012 22:12

Ist ja nur Fußball.

Gruß,
Christian Heinig
All those who believe in psycho-kinesis, raise my hand.
(Steven Wright)

Johnny
Mausschubser
Mausschubser
Beiträge: 50
Registriert: 24. Nov 2011 19:28

Re: Übung 9

Beitrag von Johnny » 6. Jul 2012 19:21

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?
It is only when we lose everything that we are free to do anything

Benutzeravatar
Owyn
BSc Spammer
BSc Spammer
Beiträge: 1012
Registriert: 5. Sep 2005 21:53
Wohnort: Rheingau

Re: Übung 9

Beitrag von Owyn » 6. Jul 2012 19:34

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
All those who believe in psycho-kinesis, raise my hand.
(Steven Wright)

Johnny
Mausschubser
Mausschubser
Beiträge: 50
Registriert: 24. Nov 2011 19:28

Re: Übung 9

Beitrag von Johnny » 7. Jul 2012 10:38

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();
It is only when we lose everything that we are free to do anything

snejjj
Mausschubser
Mausschubser
Beiträge: 52
Registriert: 26. Okt 2011 11:21

Re: Übung 9

Beitrag von snejjj » 7. Jul 2012 13:46

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 = ...

DasKlavier
Neuling
Neuling
Beiträge: 3
Registriert: 2. Aug 2012 15:30

Re: Übung 9

Beitrag von DasKlavier » 2. Aug 2012 15:57

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.?!

Benutzeravatar
mmec
Sonntagsinformatiker
Sonntagsinformatiker
Beiträge: 203
Registriert: 7. Sep 2011 17:59
Wohnort: Darmstadt

Re: Übung 9

Beitrag von mmec » 2. Aug 2012 17:46

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
FC SEEMOO No.1

combs
Neuling
Neuling
Beiträge: 6
Registriert: 28. Aug 2012 13:00

Re: Übung 9

Beitrag von combs » 28. Aug 2012 13:18

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));
}

Benutzeravatar
Owyn
BSc Spammer
BSc Spammer
Beiträge: 1012
Registriert: 5. Sep 2005 21:53
Wohnort: Rheingau

Re: Übung 9

Beitrag von Owyn » 28. Aug 2012 13:29

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
All those who believe in psycho-kinesis, raise my hand.
(Steven Wright)

combs
Neuling
Neuling
Beiträge: 6
Registriert: 28. Aug 2012 13:00

Re: Übung 9

Beitrag von combs » 28. Aug 2012 14:30

Aso Danke, das bedeutet jeder "next" der nicht "start" ist, wird als "start" gesetzt aber mit der information ""number""(Übergabe)....

Gruß,
Patrick

Antworten

Zurück zu „Archiv“