# Falscheingabe abfangen - Endlosschleife



## Firephoenix (11. Apr 2010)

Bin komplett neu hier, also nicht so böse sein zu mir ^^

Als Neueinsteiger in Java (früher schon Anfangserfahrung mit Delphi etc gemacht - gute OOP Kenntnisse)
will ich mich jetzt auch in Java einarbeiten.

Dementsprechend habe ich mit einem einfachem Additionsprogramm angefangen und dieses weiter ausgebaut. Mittlerweile habe ich einen einfachen Rechner der mit 2 Zahlen rechnen kann.
Diesen wollte ich jetzt um das Abfangen von Falscheingaben erweitern.
Das ist der Programmanfang:


```
import java.util.*;
import java.io.IOException;

public class Test {


	public static void main(String[] args)
	throws IOException
	{
		int a = 0;
		float b=0 ,c=0;
		boolean falsch;
		Scanner scanner = new Scanner(System.in);
		falsch = true;
		
		System.out.println("Geben sie bitte die erste Zahl ein:");
		do
		{
			try
			{
				b = scanner.nextFloat();
				falsch = true;
			}
			catch (InputMismatchException teste)
			{
				System.out.println("Falsche Eingabe");
				falsch = false;
			}
		}
		while(falsch);
.
.
.
```

Problem macht jetzt diese Schleife:

```
do
		{
			try
			{
				b = scanner.nextFloat();
				falsch = true;
			}
			catch (InputMismatchException teste)
			{
				System.out.println("Falsche Eingabe");
				falsch = false;
			}
		}
		while(falsch);
```

Sinn ist es, bei einer falschen Eingabe den Fehler abzufangen und auf eine neue Eingabe zu warten.
bei einem Test im Debugger ist mir aber aufgefallen, dass die Zeile 
	
	
	
	





```
b = scanner.nextFloat();
```
 einfach übersprungen wird, ohne eine neue Eingabe abzufragen.
Daher läuft das Programm bei einer richtigen Eingabe weiter, bei einer Falschen kommt die Meldung "Falsche Eingabe" in einer Dauerschleife.

Für Hilfe wäre ich sehr dankbar, da meine Bücher und auch google mich zu keiner Lösung führten - meine Eigene Javakenntnis reicht hier leider nicht aus. Daher wären Antworten nett, auch andere Lösungsvorschläge nehme ich gerne an.

Lg,
Firephoenix


----------



## faetzminator (11. Apr 2010)

Überleg dir mal, wann du [c]falsch[/c] (besser [c]isFalsch[/c] oder [c]isWrong[/c]) welchen Wert zuweisen musst.


----------



## Ziegenpeter (11. Apr 2010)

Das löst das Problem von ihm allerdings noch nicht! 

Du musst am Ende deines catch-Blockes noch hinschreiben:

```
scanner.nextLine();
```

Das Problem ist sonst nämlich, dass er nicht in die nächste Zeile geht und somit immer einen leeren String liest (oder ggf. auch was anderes je nachdem wie lang dein Falscheingabe ist). Dadurch kannst du auch keine Eingabe mehr machen, da er ja schon eine hat.


----------



## Firephoenix (11. Apr 2010)

Ihr lagt aber beide richtig, der scanner.nextLine() hat aber das Problem mit dem Endlosdurchlauf gelöst. Die boolean-Variable sollte so auch stimmen.
Jetzt leistet der Quellcode auch das was ich von ihm will, hab ein paar Ecken auch nochmal geändert.

hier die korrekte Version:


```
import java.util.*;
import java.io.IOException;

public class Test {


	public static void main(String[] args)
	throws IOException
	{
		int a = 0; //Auswahlvariable
		float b=0 ,c=0; //Rechenvariable
		boolean falsch = true; //Variable zum Abfangen falscher eingaben (Schleifenabbruch)
		Scanner scanner = new Scanner(System.in); //Eingabeobjekt
		
		//Eingabe der ersten Zahl
		do
		{
			try
			{
				System.out.println("Bitte die erste Zahl eingeben");
				b = scanner.nextFloat();
				falsch = false;
			}
			catch (InputMismatchException teste)
			{
				System.out.println("Falsche Eingabe");
				scanner.nextLine();
				falsch = true;
			}
		}
		while(falsch);
		//Eingabe der ersten Zahl Ende
		falsch = true;
		//Eingabe der zweiten Zahl
		do
			try
			{
				System.out.println("Bitte die zweite Zahl eingeben");
				c = scanner.nextFloat();
				falsch = false;
			}
			catch (InputMismatchException teste)
			{
				System.out.println("Falsche Eingabe");
				scanner.nextLine();
				falsch = true;
			}
		while  (falsch);
		//Eingabe der zweiten Zahl Ende
		falsch = true;
		//Eingabe der Rechenauswahl
		do
			try
			{	
				System.out.println("Zahl 1: " + b + " Zahl 2: " + c);
				System.out.println("Für Addition drücken sie die 1");
				System.out.println("Für Subtraktion drücken sie die 2");
				System.out.println("Für Multiplikation drücken sie die 3");
				System.out.println("Für Division drücken sie die 4");
				a = scanner.nextInt();
				falsch = false;
			}
			catch (InputMismatchException teste)
			{
				System.out.println("Falsche Eingabe");
				scanner.nextLine();
				falsch = true;
			}
			while  (falsch);	
			//Eingabe der Rechenauswahl Ende
			falsch = true;
			//Rechnungsblock

			switch (a)
			{
				case 1: //Addition
				{
					System.out.println("Addition");
					System.out.println("Das Ergebnis von " + b + "+" + c + " ist: " + (b+c));
					break;
				}
				case 2:  //Subtraktion
				{
					System.out.println("Subtraktion");
					System.out.println("Das Ergebnis von " + b + "-" + c + " ist: " + (b-c));
					break;
				}
				case 3: //Multiplikation
				{
					System.out.println("Multiplikation");
					System.out.println("Das Ergebnis von " + b + "*" + c + " ist: " + (b*c));
					break;
				}
				case 4: //Division
				{
					System.out.println("Division");
					System.out.println("Das Ergebnis von " + b + "/" + c + " ist: " + (b/c));
					break;
				}
				default: System.out.println("Bitte geben sie eine Zahl zwischen 1 und 4 ein");
			}
	
	}

}
```

nächster Schritt wird dann sein, das ganze in eine weitere Schleife zu packen, und um andere Funktionen zu erweitern. Das Thema hier hat sich aber erledigt.


----------



## Farbenfroh (4. Apr 2014)

Hi!
Sorry für das Ausgraben dieses alten Schinkens.
Habe gerade ein mehr oder weniger identisches Programm und gerade nach längerer Suche endlich meinen Fehler gefunden:
statt 
	
	
	
	





```
import java.util.*;
import java.io.IOException;
```
hatte ich nur den Scanner importiert:

```
import java.util.Scanner;
import java.io.IOException;
```

Ich bekam dann die Fehlermeldung im Catch-Block:
"inputmismatchexception cannot be resolved to a type"

Gut, durch importieren des kompletten util-Paketes hat es dann geklappt.
Aber was ich mich nun frage: Wenn ich nicht das ganze Paket importieren will, welche Klasse aus der util-Sammlung hätte ich gezielt importieren müssen um die Fehlermeldung zu beheben??


----------



## kaoZ (4. Apr 2014)

Ich tippe mal auf eine parse exception , ohne mir das jetzt durchgelesen zu haben


----------

