Methoden Kontrollstruktur versagt bei Buchstaben...

k3ltis

Mitglied
Hallo!

Hier erstmal der Code:
Java:
    public static int bestimmeZahl(){ //Zahl von 0 bis 36 eingeben---------------------------------------M
    	int zahl;
    	do{
    		System.out.println("Bitte Zahl von 0 bis 36 eingeben.");
    		zahl=In.readInt();
    		if (zahl>=0 && zahl<37){
    			break;
    		}else{
    			System.out.println("Keine gültige Eingabe.\n");
    		}
		} while (true);
		return zahl;
    }

Also diese Methode fragt eine Zahl ab, die der Benutzer eingeben und die zwischen 0 und 36 liegen soll. Wenn die Eingabe nicht innerhalb des Definitionsbereichs liegt soll die Eingabe wiederholt werden.

Doch wenn ich Buchstaben eingebe springt die Eingabe nicht zurück sondern verlässt die Schleife und fährt fort....


Das Komsiche ist, dass ich diese Kontrollstrukur schon einmal für eine char-Eingabe verwendet habe und da funktioniert sie ohne Probleme. Sieht so aus:

Java:
do {	//richtiger Buchstabe eingegeben?	
					antwort = In.readChar();
					if (antwort == 'a' | antwort == 'b' | antwort == 'c' | antwort == 'd' | antwort == 'e' | antwort == 'v'){
						break;
					}else{
						System.out.println("Eingabe unzulässig.");
					}
				} while(true);

Bin für Vorschläge dankbar.


Nachtrag: Ok... also der zweite Code ist auch nicht so ganz richtig... die Kontrollstruktur wiederholt zwar, wenn man Zahlen eingibt doch z.B. bei der Eingabe "agh" wird so getan als sei nur der Char "a" eingeben worde... doch eigentlich soll auch dann die Eingabe wiederholt werden.
 
Zuletzt bearbeitet:
Dazu müsste man wissen was hinter
Code:
In
und der Methode
Code:
readInt()
steckt.
Bei readChar() wird wohl ein Zeichen eingelesen und da spielt es keine Rolle ob das ein Buchstabe oder eine Ziffer ist. Bei readInt() ist das vermutlich anders und es wird eventuell sogar eine Exception geworfen.
 
Nachtrag: Ok... also der zweite Code ist auch nicht so ganz richtig... die Kontrollstruktur wiederholt zwar, wenn man Zahlen eingibt doch z.B. bei der Eingabe "agh" wird so getan als sei nur der Char "a" eingeben worde... doch eigentlich soll auch dann die Eingabe wiederholt werden.
Nachtrag zu Deinem Nachtrag (siehe meine Vermutung zu readChar im ersten Post). Eventuell bietet In ja eine Methode readString() oder readLine() mit der man das Abfangen kann.
 
Ok.

Die Klasse In wurde uns zur Verfügung gestellt um damit zu arbeiten.
Ich habe an der Klasse nichts verändert.


Java:
import java.io.*;

/*****************************************************
 Klasse zum Einlesen von Daten

 Folgende Klassen-Variable sind implementiert:
 private BufferedReader d


 Folgende Klassen-Methoden sind implementiert:
 int readInt() // liest ein int-Wert von Konsole ein
 void close()  // zum Schließen des BufferedReaders

 Folgende Instanz-Methode sind implementiert:
 void finalize()	// zum Schließen des BufferedReaders
                    // kann es nur einmal geben
                    // macht wahrscheinlich wenig Sinn da keine Instanz

 ******************************************************/

public class In{

	static private BufferedReader inputSteam = new  BufferedReader(new InputStreamReader(System.in));

	public static char readChar() {

		String s;

		if (inputSteam != null) { // Erzeugung überprüfen
			try {
					s = inputSteam.readLine();
					// wenn ein String eingegeben wurde, der mindestens ein Zeichen besitzt ...
					if (s != null && s.length() > 0) 
						// ... dann gibt das erste Zeichen des Strings zurueck
						return s.charAt(0); 
					else
						return '0';
			} catch (IOException e) {
					System.out.println(e);
					return '0';
			}
	     } else {

			System.out.println("Es konnte nichts eingelesen werden! Rückgabewert 0!");
			return '0';
		}
}

	
	public static int readInt() {

		int wert;

		if (inputSteam != null) { // Erzeugung überprüfen
			try {
				try {
					wert = Integer.parseInt(inputSteam.readLine());
				} catch(NumberFormatException e) {
						System.out.println(e);
						wert = 0;
				}
				// Eingabe-Streams wieder schließen

				return wert;

			 } catch (IOException e) {
					System.out.println(e);
					return 0;
			 }
	     } else {

			System.out.println("Es konnte nichts eingelesen werden! Rückgabewert 0!");
			return 0;
		}
	}

	public static long readLong() {

			long wert;

			if (inputSteam != null) { // Erzeugung überprüfen
				try {
					try {
						wert = Long.parseLong(inputSteam.readLine());
					} catch(NumberFormatException e) {
							System.out.println(e);
							wert = 0;
					}
					// Eingabe-Streams wieder schließen

					return wert;

				 } catch (IOException e) {
						System.out.println(e);
						return 0;
				 }
		     } else {

				System.out.println("Es konnte nichts eingelesen werden! Rückgabewert 0!");
				return 0;
			}
	}

	public static float readFloat() {

				float wert;

				if (inputSteam != null) { // Erzeugung überprüfen
					try {
						try {
							wert = Float.parseFloat(inputSteam.readLine());
						} catch(NumberFormatException e) {
								System.out.println(e);
								wert = 0;
						}
						// Eingabe-Streams wieder schließen

						return wert;

					 } catch (IOException e) {
							System.out.println(e);
							return 0;
					 }
			     } else {

					System.out.println("Es konnte nichts eingelesen werden! Rückgabewert 0!");
					return 0;
				}
	}

	public static double readDouble() {

				double wert;

				if (inputSteam != null) { // Erzeugung überprüfen
					try {
						try {
							wert = Double.parseDouble(inputSteam.readLine());
						} catch(NumberFormatException e) {
								System.out.println(e);
								wert = 0;
						}
						// Eingabe-Streams wieder schließen

						return wert;

					 } catch (IOException e) {
							System.out.println(e);
							return 0;
					 }
			     } else {

					System.out.println("Es konnte nichts eingelesen werden! Rückgabewert 0!");
					return 0;
				}
	}

	public static String readString() {

			String s;

			if (inputSteam != null) { // Erzeugung überprüfen
				try {
						s = inputSteam.readLine();
						return s;
				} catch (IOException e) {
						System.out.println(e);
						return null;
				}
		     } else {

				System.out.println("Es konnte nichts eingelesen werden! Rückgabewert 0!");
				return null;
			}
	}

	public static void close() {
		try {
			inputSteam.close();
		} catch (IOException e) {
				System.out.println(e);
		}
	}

	protected void finalize() throws Throwable {

		// Eine verwendetet temporärer Datei löschen 
		// Wenn die Datei nicht existiert oder tempfile null ist,
		// dann kann dies eine Ausnahme auslösen, s. throws
		inputSteam.close();
	}



}
 
Durch
Code:
zahl = In.readInt();
erhälst du bei einer Falschen Eingabe eine 0 zurück, somit wird die while-Schleife beendet.
 
Oje, bei der Implementierung in der Klasse In hast Du keine Chance etwas mit
Code:
>=0
abzufangen, da diese im Falle eine ungültigen Eingabe den Wert 0 zurückgibt. Du könntest höchstens den Anwender auffordern eine Zahl von 1 bis x einzugeben, dann müsste die Kontrollstruktur funktionieren.
 
Also danke für den Hinweis.

Habe eure Erklärung verstanden... gibts es die Möglichkeit die In Klasse für den returnWert 0 zu ändern?

Macht aber wahrscheinlihc wenig Sinn für andere Zugriffe auf deren Methoden, nicht wahr?

Gruß
K3ltis
 

Zurück
Oben