Hausübung 9

Benutzeravatar
s!mon
Computerversteher
Computerversteher
Beiträge: 373
Registriert: 20. Okt 2007 18:24
Wohnort: Höchst i. Odw

Re: Hausübung 9

Beitrag von s!mon » 9. Jan 2008 22:23

e.printStackTrace() sagt mir auch nichts, keine Ahnung was das ist. Bitte um Aufklärung :)

Die Fehlermeldung NumberFormatException zeigt dir Java ja an wenn du einen Buchstaben drückst: "Exception in thread "main" java.lang.NumberFormatException: For input string: "a"" Dann weißt du ja welche du abfangen musst. Try und Catch hatten wir in der Vorlesung noch nicht wirklich, wird noch kommen denke ich.

Benutzeravatar
Krümelmonster
Geek
Geek
Beiträge: 767
Registriert: 17. Okt 2007 13:58
Wohnort: Jossgrund

Re: Hausübung 9

Beitrag von Krümelmonster » 9. Jan 2008 22:31

Wenn ich die IOException, meckert Eclipse, dass in der Zeile:

Code: Alles auswählen

String s = buf.readLine();
...eine IOException fehlt. Wenn ich Eclipse nun den Fehler beheben lasse, dann
schreibt es mir diesen Code.

Was printStackTrace() macht könnt ihr hier lesen.
Stell deinen Fuß auf einen hohen Sockel
Mach dir ein Haar aus tausend Locken
Du bleibst doch immer, was du bist!

Benutzeravatar
Krümelmonster
Geek
Geek
Beiträge: 767
Registriert: 17. Okt 2007 13:58
Wohnort: Jossgrund

Re: Hausübung 9

Beitrag von Krümelmonster » 10. Jan 2008 15:23

Mal eine andere Frage.

Wie kann ich eine Kopie eines Objekts erstellen, damit ich mit nextMoveWins() zunächst
im Objekt einen Zug durchführen kann, bevor ich prüfe, ob er zum Sieg führt?
Stell deinen Fuß auf einen hohen Sockel
Mach dir ein Haar aus tausend Locken
Du bleibst doch immer, was du bist!

Benutzeravatar
s!mon
Computerversteher
Computerversteher
Beiträge: 373
Registriert: 20. Okt 2007 18:24
Wohnort: Höchst i. Odw

Re: Hausübung 9

Beitrag von s!mon » 10. Jan 2008 17:13

Wieso so kompliziert? Ich habe mir einfach eine Hilfsfunktion gemacht, die einen Zug rückgängig macht (also quasi den obersten Stein einer Reihe entfernt). Dann setze ich in jede Reihe einen Stein, überprüfe ob ein Spieler gewonnen hat, entferne ihn wieder und gebe true / false zurück. Dadurch brauche ich nur eine kleine neue Funktion und kannst ansonsten hasWon() verwenden.

Benutzeravatar
Krümelmonster
Geek
Geek
Beiträge: 767
Registriert: 17. Okt 2007 13:58
Wohnort: Jossgrund

Re: Hausübung 9

Beitrag von Krümelmonster » 10. Jan 2008 17:37

Klar so geht es auch.

Ich habe mir nur gedacht, ich verwende temporäre Abbilder
meines Objekts, da ja eigentlich auch kein Zug durchgeführt wird.
Stell deinen Fuß auf einen hohen Sockel
Mach dir ein Haar aus tausend Locken
Du bleibst doch immer, was du bist!

Benutzeravatar
Krümelmonster
Geek
Geek
Beiträge: 767
Registriert: 17. Okt 2007 13:58
Wohnort: Jossgrund

Re: Hausübung 9

Beitrag von Krümelmonster » 10. Jan 2008 20:49

Exception.java:

Code: Alles auswählen

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;


public class Exception {
	public static void main(String[] args) {
		Exception e = new Exception();
		int r;
		do {
			r = e.getPlayerMove('d');
		}while(r==-1);
	}
	
	public int getPlayerMove(char player) {
		int col = -1;
		try {
			BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));
			String s = buf.readLine();
			col = Integer.parseInt(s);
		} catch (NumberFormatException ex) {
			System.err.append("\nInvalid input. Please type in a number between 0 and 5\n");
			getPlayerMove(player);
		} catch (IOException e) {
			System.err.append("\nUnknown Error. Please try again.");
			getPlayerMove(player);
		}
		return col;
	}
}
Leider verhält sich diese Klasse noch nicht wie erwünscht.

Wenn ich etwa ein "a" eingebe, dann erscheint zuerst wie gewünscht die Fehlermeldung "Invalid input.".
Wenn ich jetzt aber eine positive Zahl eingebe, sollte das Programm einfach terminieren, aber
erst beim zweiten Eingeben der Zahl wird sie erkannt.

Kann mir das Verhalten jemand erklären?
Stell deinen Fuß auf einen hohen Sockel
Mach dir ein Haar aus tausend Locken
Du bleibst doch immer, was du bist!

Benutzeravatar
blackcomb
Mausschubser
Mausschubser
Beiträge: 70
Registriert: 1. Okt 2007 15:48
Wohnort: Darmstadt

Re: Hausübung 9

Beitrag von blackcomb » 10. Jan 2008 23:03

Code: Alles auswählen

...
   public int getPlayerMove(char player) {
      int col = -1;
      try {
         BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));
         String s = buf.readLine();
         col = Integer.parseInt(s);
      } catch (NumberFormatException ex) {
         System.err.append("\nInvalid input. Please type in a number between 0 and 5\n");
         col = getPlayerMove(player); // Rückgabewert speichern
      } catch (IOException e) {
         System.err.append("\nUnknown Error. Please try again.");
         col = getPlayerMove(player); // hier dasselbe
      }
      return col;
   }
Wenn du das Ergebnis des rekursiven getPlayerMove-Aufrufs in col speicherst, sollte es gehen :wink:

Benutzeravatar
guido
Computerversteher
Computerversteher
Beiträge: 378
Registriert: 30. Nov 2003 21:24
Wohnort: Mühltal
Kontaktdaten:

Re: Hausübung 9

Beitrag von guido » 11. Jan 2008 09:28

Krümelmonster hat geschrieben:Hast du nicht.

Das hat mir Eclipse so angeboten. ;-)
Besser gesagt: noch nicht, da Exceptions leider erst in T18 drankommen. Für die Aufgabe brauchten wir sie (in sehr geringem Rahmen) aber leider schon. :(
Im Zweifelsfall hilft auch immer die (sehr gute!) API-Docu weiter, indem man einfach bei FileNotFoundException (oder was auch immer) nachsieht, "was es gibt".

Guido

Benutzeravatar
Dominik
Windoof-User
Windoof-User
Beiträge: 26
Registriert: 4. Okt 2007 09:40
Wohnort: Wiesbaden

Re: Hausübung 9

Beitrag von Dominik » 11. Jan 2008 10:24

s!mon hat geschrieben:

Code: Alles auswählen

try {
	BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));
	String s = buf.readLine();
	col = Integer.parseInt(s);
} catch (NumberFormatException ex) {
	System.err.append("Wrong Input. You must enter a number between 0 and " + (columns - 1) + "! Please try again.");
	playGame();
}
Habe jetzt noch ein bißchen rumgespielt. Obiges Beispiel mit try und catch funktioniert ohne Probleme. Ich gebe eine Fehlermeldung aus und lasse den Spieler der am Zug ist so oft die Eingabe wiederholen bis sie passt. Kann man das so lassen? Habt ihr System.err.append() noch irgendwo anders verwendet?
Jetzt muss ich auch mal meinen Senf dazugeben :P

bei einem falschen Aufruf nochmals playGame(); zu starten, finde ich sehr gefährlich... Keine Ahnung, ob das heute noch gilt, aber wenn du einen solchen Aufruf machst, wirst du nach Eingabe von X Buchstaben auch X mal die Methode playGame(); aufgerufen haben. (hab mir das im Debugger angeschaut und das stimmt immer noch...) Das ist meiner Meinung nach ein grober Fehler, da jeder Aufruf auch Speicher kostet... Noch ist das nicht schlimm, aber besser Fehler vermeiden, bevor man es immer so macht und sich am Ende fragt, warum die Programme immer mehr Speicher brauchen XD

Benutzeravatar
Krümelmonster
Geek
Geek
Beiträge: 767
Registriert: 17. Okt 2007 13:58
Wohnort: Jossgrund

Re: Hausübung 9

Beitrag von Krümelmonster » 11. Jan 2008 14:39

Das Problem der Speicherverwaltung überlasse ich einfach Java. ;)

Da haben wir in Scheme schon schlimmere Sachen mit Rekursion gemacht. :mrgreen:

//edit
@blackcomb: Ah, klar. Danke!
Stell deinen Fuß auf einen hohen Sockel
Mach dir ein Haar aus tausend Locken
Du bleibst doch immer, was du bist!

Benutzeravatar
Dominik
Windoof-User
Windoof-User
Beiträge: 26
Registriert: 4. Okt 2007 09:40
Wohnort: Wiesbaden

Re: Hausübung 9

Beitrag von Dominik » 14. Jan 2008 10:01

Naja, ich sags mal so: Rekursion lösst sich irgendwann auf, da ja die Triviale Rekursionsbedingung erreicht ist, was ist aber das für ein Aufruf in deinem Code? Er ist nicht trivial, aber theoretisch unendlich oft wiederholbar und solange dein Spiel läuft bleibt jeder Aufruf im Speicher. Ich sag ja, noch ist das nicht schlimm, was aber wenn du solche 'Fehler' machst mit Programmen die ein vielfaches an Speicher brauchen ;)

Stumpf.Alex
Nerd
Nerd
Beiträge: 643
Registriert: 1. Okt 2007 12:40
Wohnort: Darmstadt
Kontaktdaten:

Re: Hausübung 9

Beitrag von Stumpf.Alex » 14. Jan 2008 10:36

Außerdem mal ganz dumm gefragt, erwartet nicht die Methode, die getPlayerMove das erste mal aufgerufen hat selbst eine Fuktionsrückgabe? Irgendwann wird halt die Rekursion aufgelöst und dann kann es zu sehr unschönen Ergebnisen kommen, wenn man nicht aufpasst. Denn das Spiel ist eigentlich fertig aber es laufen noch ein paar getPlayerMove Rückgaben aus, die ja logeischerweise verarbeitet werden müssen. Hier ist das noch trivial zu umgehen, aber woanders könnte sowas fatal sein.
Zuletzt geändert von Stumpf.Alex am 14. Jan 2008 12:56, insgesamt 1-mal geändert.

Benutzeravatar
Dominik
Windoof-User
Windoof-User
Beiträge: 26
Registriert: 4. Okt 2007 09:40
Wohnort: Wiesbaden

Re: Hausübung 9

Beitrag von Dominik » 14. Jan 2008 12:24

endlich schlägt sich jemand auf meine Seite... :P

aber genau das meine ich, solche offenen Lücken können unheimlich enden... Und am Ende weiss man nicht mehr, wo einem noch der Kopf steht (oder das Programm) :x

Benutzeravatar
Krümelmonster
Geek
Geek
Beiträge: 767
Registriert: 17. Okt 2007 13:58
Wohnort: Jossgrund

Re: Hausübung 9

Beitrag von Krümelmonster » 14. Jan 2008 14:21

@Stumpf.Alex:
In diesem Fall ist der Rekursionsaufruf unproblematisch, da danach nur das return kommt.
Der gültige Wert wird also einfach die Rekursionsebenen nach oben durchgereicht.

Alternativ könnte ich auch die Methode getPlayerMove() eine Exception werfen lassen, die
dann in playGame() abgefangen wird und zu einem erneuten Aufruf von getPlayerMove() führt.
Stell deinen Fuß auf einen hohen Sockel
Mach dir ein Haar aus tausend Locken
Du bleibst doch immer, was du bist!

Benutzeravatar
C--
Mausschubser
Mausschubser
Beiträge: 96
Registriert: 2. Okt 2006 15:08
Wohnort: Gelnhausen

Re: Hausübung 9

Beitrag von C-- » 14. Jan 2008 15:10

Rekursion ist eher selten der schnellste weg (im Sinne von Ausführungszeit) eine Aufgabe zu lösen.
Denkt daran, das mit jedem Funktionsaufruf der Platz auf eurem Stack kleiner wird, Parameter brauchen ja auch Platz ;-)
Spätestens wenn der Stack überläuft merkt man dann, das es iterativ vielleicht besser gewesen wäre :twisted:
Team?
Toll Ein Anderer Machts

Antworten

Zurück zu „Archiv“