Hausübung 9

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

Hausübung 9

Beitrag von Stumpf.Alex » 7. Jan 2008 02:43

Hallo,
Überprüfen Sie für die Parameter, ob die übergebenen Werte sinnvoll sind
und weisen Sie auf etwaige Fehleingaben mit System.err.append("[Ihr Fehlerhinweis]")
hin.
wir sollen ja also in der Hausübung alle Fehleingaben abfangen...nun zwei Fragen dazu:

1. Sollen wir nur die Fehler, die durch direkte Tastaturabfrage entstehen können (z.B. falsche Spalte gewählt) abfangen oder auch alle Fehler die durch Aufrufe von Methoden mit falschen/ungültigen Parametern entstehen, aber nicht im direkten Zusammenhang mit der Tastatureingabe zusammenhängen, also im normalfall gar nicht auftreten?

2. Wie kann man den Fehler rausbekommen, dass anstelle einer Zahl ein Buchstabe beispielsweise eingeben wurde? Der Fehler liegt nämlich genau in der vorimplementierten Methode, die Sachen verwendet, die wir so nicht kennen.

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

Re: Hausübung 9

Beitrag von guido » 7. Jan 2008 08:11

Siehe hierzu u.a. die Klasse "SimpleFileParser"; dort wird in der Methode "getNextNumber()" z.B. mittels isNumeric(char) geprüft, ob der Wert legal ist. Diesen Test -- in der Klasse als private Methode deklariert und daher sinngemäß umzuwandeln -- könnt ihr als Vorlage nutzen. :)
Guido

ChristianK
BASIC-Programmierer
BASIC-Programmierer
Beiträge: 127
Registriert: 13. Sep 2007 01:15
Wohnort: Darmstadt
Kontaktdaten:

Re: Hausübung 9

Beitrag von ChristianK » 7. Jan 2008 23:56

Im Template ist eine Variable private Object String; vorgegeben. Wofür soll man die verwenden? Und soll man Eingaben sowohl in den Unterprozeduren als auch in der playGame Funktion prüfen? Also doppelt? Oder nur in den Unterprozeduren? Und gibt es auch hier wieder Abzug, wenn man mehr als 15 Zeilen Code pro Funktion hat?

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

Re: Hausübung 9

Beitrag von Stumpf.Alex » 8. Jan 2008 00:05

ChristianK hat geschrieben:Im Template ist eine Variable private Object String; vorgegeben.
Wo denn das? Kannst du mal ein paar Codezeilen, die das umschließen posten?

ChristianK
BASIC-Programmierer
BASIC-Programmierer
Beiträge: 127
Registriert: 13. Sep 2007 01:15
Wohnort: Darmstadt
Kontaktdaten:

Re: Hausübung 9

Beitrag von ChristianK » 8. Jan 2008 16:16

Ähm ja jetzt ist es irgendwie weg und ich komm mir etwas blöd vor^^ Entweder das wurde geändert oder aber ich hab das selbst reingeschrieben, an was ich mich aber nicht erinnern kann zumal ich dann ja vermutlich wüsste was ich damit machen soll :lol: Also sorry vergesst es^^

Benutzeravatar
Demmi
Kernelcompilierer
Kernelcompilierer
Beiträge: 423
Registriert: 1. Okt 2007 12:56
Wohnort: Darmstadt

Re: Hausübung 9

Beitrag von Demmi » 8. Jan 2008 19:24

Du bist vermutlich durch den Debugger in irgendeiner internen Java-Klasse gelandet. Das passiert immer mal, wenn manns mit dem debuggen zu genau nimmt und sich System.out's genauer ansehen will ;)
Saying that Java is nice because it works on all Plattforms is like saying that anal sex is nice because it works on all genders.

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 18:29

Wie überprüfe ich denn richtig, ob eine Benutzerangabe gültig war? Ist ne Weile her, dass ich mit Exceptions gearbeitet habe :)

Ich habe eine Funktion isInRange die überprüft, ob die eingegebene Zahl zwischen 0 und columns (also normalerweise 6) ist. Das funktioniert auch wunderbar. Nur sobald der Benutzer irgendetwas anderes als eine Zahl eingibt bekomme ich die Fehlermeldung "Exception in thread "main" java.lang.NumberFormatException: For input string: "ä"". Habe jetzt versucht da irgendwie ein Try und Catch einzubauen, funktioniert aber leider auch nicht. Was muss ich machen, weiß leider nicht mehr wie das funktioniert..

ciao, Simon.

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 18:30

Ach und noch eine Frage. Benutzt ihr nextMoveWins() in eurem Programm? Ich meine dem Benutzer einen Hinweis geben, dass er mit dem nächsten Zug gewinnen kann ist ja doof..

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

Re: Hausübung 9

Beitrag von Stumpf.Alex » 9. Jan 2008 21:05

Wie überprüfe ich denn richtig, ob eine Benutzerangabe gültig war?
Das ist net so einfach und mit catch und try kommst du nicht weit. Also der Fehler liegt in folgender Zeile:

Code: Alles auswählen

col = Integer.parseInt(s);
Dieser Aufruf stürzt ab, sobald irgendein nicht numerisches Zeichen im String ist, d.h. du musst deine isInRange so anpassen, dass sie erkennt, ob alle Zeichen den eingebenen Strings numerisch sind. Man muss auch aufpassen, denn für Inter.parseInt(String s) gilt, dass ein äuqivalenter endlicher deterministischer Automat nicht das leere Wort akzeptiert. :wink: Auf deutsch: ein leerer String führt auch zum Absturz.
Benutzt ihr nextMoveWins() in eurem Programm? Ich meine dem Benutzer einen Hinweis geben, dass er mit dem nächsten Zug gewinnen kann ist ja doof..
Genau das habe ich so drin..aber auskommentiert, weil das ich dann echt doof.

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 21:22

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?

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

Re: Hausübung 9

Beitrag von Stumpf.Alex » 9. Jan 2008 21:38

?!? Habe deinen Code einfach mal kopiert und er funktioniert bei mir nicht... :(

Code: Alles auswählen

Exception in thread "main" java.lang.NumberFormatException: For input string: "a"
	at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
	at java.lang.Integer.parseInt(Integer.java:447)
	at java.lang.Integer.parseInt(Integer.java:497)
	at ConnectFour.getPlayerMove(ConnectFour.java:104)
	at ConnectFour.playGame(ConnectFour.java:316)
	at ConnectFour.main(ConnectFour.java:342)
Deshalb hatte ich auch abgebrochen mit dem catch, try zu arbeiten.

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 21:55

Also bei mir funktionierts wunderbar. Der Fehler muss ja irgendwie an deinem Catch liegen. Es kann ja eigentlich nicht sein, dass du eine NumberFormatException abfängst, diese aber an den Kopf geschmissen bekommst.

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 21:58

Bei mir funktioniert es auch.

Habe den Code mal in eine eigene Klasse gepackt zum Testen:

Code: Alles auswählen

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


public class Exception {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		playGame();
	}
	
	public static void playGame() {
		try {
			   BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));
			   String s = buf.readLine();
			   int col = Integer.parseInt(s);
		} catch (NumberFormatException ex) {
			int columns = 5;
			System.err.append("Wrong Input. You must enter a number between 0 and " + (columns - 1) + "! Please try again.");
			   playGame();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
Stell deinen Fuß auf einen hohen Sockel
Mach dir ein Haar aus tausend Locken
Du bleibst doch immer, was du bist!

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

Re: Hausübung 9

Beitrag von Stumpf.Alex » 9. Jan 2008 22:19

Ok..danke, hab den Fehler gefunden.

Aber wie seit ihr NumberFormatException und e.printStackTrace() gekommen? Das ist mir nämlich total fremd. Oder habe ich da was in der Vorlesung verpasst?

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:22

Hast du nicht.

Das hat mir Eclipse so angeboten. ;-)
Stell deinen Fuß auf einen hohen Sockel
Mach dir ein Haar aus tausend Locken
Du bleibst doch immer, was du bist!

Antworten

Zurück zu „Archiv“