# Try/Catch in While-Schleife mit Scanner - Hilfe!



## babuschka (20. Dez 2006)

Hallo ich habe folgendes Problem:

Ich möchte eine beliebige Zahl vom Benutzer eingeben (mit Hilfe eines Scanners) und durch eine Try-Catch-Anweisung kontrollieren lassen, ob die Eingabe nicht evtl. Buchstaben oder Zeichen anstatt einer Zahl war. Mit folgendem Quelltext funktioniert das wunderbar:


```
import java.util.Scanner;
import java.util.InputMismatchException;

public class TryCatch
{
	public static void main(String[] args)
	{
		Scanner meinScanner = new Scanner(System.in);
	        System.out.println("Bitte eine Zahl eingeben:");

		try
		{
			int x = meinScanner.nextInt();
			System.out.println("Ihre Zahl lautet: "+x);
		}
	
		catch(InputMismatchException e)
		{
			System.out.println("Das ist keine Zahl gewesen!");
		}
	}
}
```

Wenn ich jedoch möchte, dass der Benutzer solange die Eingabe tätigen kann, bis er eine Zahl eingegeben hat schreibe ich folgendes:


```
import java.util.Scanner;
import java.util.InputMismatchException;

public class TryCatch
{
	public static void main(String[] args)
	{
		Scanner meinScanner = new Scanner(System.in);
		System.out.println("Bitte eine Zahl eingeben:");
		boolean control = false;
		
		while(control==false)
		{
			try
			{
				int x = meinScanner.nextInt();
				System.out.println("Ihre Zahl lautet: "+x);
				control = true;
			}
	
			catch(InputMismatchException e)
			{
      				System.out.println("Das ist keine Zahl gewesen! Wiederholen Sie die Eingabe:");
			}
		}	

	}
}
```

Das Resultat artet leider in die Endlosschleife 

*Das ist keine Zahl gewesen! Wiederholen Sie die Eingabe:
Das ist keine Zahl gewesen! Wiederholen Sie die Eingabe:
Das ist keine Zahl gewesen! Wiederholen Sie die Eingabe:
Das ist keine Zahl gewesen! Wiederholen Sie die Eingabe:
Das ist keine Zahl gewesen! Wiederholen Sie die Eingabe:
[...]*

aus anstatt in die erneute Eingabemöglichkeit.

Was hab ich falsch gemacht? Ich komm einfach nich auf den Fehler...

Thx & Gruß
DaSaeschOnAir


----------



## Murray (20. Dez 2006)

Das Problem besteht darin, dass die fehlerhafte Eingabe immer noch im Eingabepuffer steht; der nächste Aufruf von nextInt bekommt also wieder den gelichen String. Um das zu verhindern, muss man den Wert auslesen:


```
try
         {
            int x = meinScanner.nextInt();
            System.out.println("Ihre Zahl lautet: "+x);
            control = true;
         }
   
         catch(InputMismatchException e)
         {
        	 String errStr = meinScanner.next();
                 System.out.println( errStr + " ist keine Zahl! Wiederholen Sie die Eingabe:");
         }
```

Noch ein paar Anmerkungen:
1. Bool'sche Werte sollte man nicht mit Konstanten vergelichen, sondern direkt benutzen, also nicht

```
while( control == false) {
```
sondern

```
while( !control) {
```
2. Auf die Variable control könnte man auch komplett verzichten:

```
while ( true) {
        try {
            int x = meinScanner.nextInt();
            System.out.println("Ihre Zahl lautet: "+x);
            break; //--- Eingabe OK, Schleife kann beendet werden
        } catch(InputMismatchException e) {
            String errStr = meinScanner.next();
            System.out.println( errStr + " ist keine Zahl! Wiederholen Sie die Eingabe:");
        }
}
```


----------



## Beni (20. Dez 2006)

"nextInt" versucht vom unterliegenden Stream zu lesen. Wenn das nicht geht (weil kein int in der Eingabe ist), dann bleibt alles beim alten, und es wird eine Exception geworfen.
Wenn aber alles beim alten blieb, kann beim nächsten Aufruf auch kein int eingelesen werden... und schon steckt man in einer Endlosschleife.

Versuch mal im catch-Block einfach die aktuelle Eingabe zu lesen (Methode next), um die falsche Eingabe fortzuwerfen.


----------



## babuschka (20. Dez 2006)

Danke für die Lösung des Problems und eure sonstigen Ratschläge, jetzt gehts wunderbar...


----------

