# Scanner-Methode: Mehrere Eingaben mit Exception behandeln



## mefistochen (21. Apr 2009)

Hallo!

Habe nachfolgendes Programm geschrieben.
Hierin sollen 2 Werte eingegeben werden. Wenn der Benutzer die Werte falsch eingibt, z. B. ein . anstatt , verwendet für die Darstellung seiner Wunschzahl, soll das Programm selbst einen Wert festsetzen. 

Wenn das bei der 2. Eingabe des Benutzers passiert, so verwendet das Programm richtigerweise die vom Benutzer gemachte 1. Eingabe.

Wenn der Benutzer jedoch schon bei der 1. Eingabe einen Fehler macht, so hat er beim 2. Wert nicht mehr die Möglichkeit, eine Eingabe zu machen.

Scheinbar steckt die fehlerhafte erste im Scanner-Objekt, während die 2. Zahl abgefragt wird. Ich habe bei Scanner aber keine Methode gefunden, die den Inhalt eines Scanner-Objektes leert. Aber hier zunächst das Minimalprogramm:


```
import java.util.InputMismatchException;
import java.util.Scanner;
public class Test {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        System.out.println("T eingeben!");
        double T;
        try {
            T = in.nextDouble();
        } 
catch (InputMismatchException e) {
            System.out.println("Die Eingabe war inkorrekt. T wird auf 1 gesetzt.");
            T=1.0;
        }
        System.out.println("v eingeben!");
        double v;
        try{
            v=in.nextDouble();
        } catch(InputMismatchException e){
            System.out.println("Die Eingabe war inkorrekt. v wird auf 7 gesetzt.");
            v=7.0;
        }
System.out.println("T hat den Wert "+T);
         System.out.println("v hat den Wert "+v);
    }
}
```
[Edit Ebenius]Damit keiner Augenkrebs bekommt, hab ich mal die JAVA-Tags noch reineditiert.

Gibt es eine Möglichkeit, den Inhalt eines Scanner-Objektes zu leeren oder sollte das anders gelöst werden?

Viele Dank!
mefistochen


----------



## SlaterB (21. Apr 2009)

es gibt auch schöne [ java ][/ java ]-Tags für Code

mit readLine()
kannst du alles bis zum nächsten Enter einlesen (und gleich vergessen)


----------



## mefistochen (21. Apr 2009)

OK: 


```
import java.util.InputMismatchException;
import java.util.Scanner;
//import java.io.*;
public class Test {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        System.out.println("T eingeben!");
        double T;
        try {
            T = in.nextDouble();

        } catch (InputMismatchException e) {
            System.out.println("Ich habe den inkorrekten Wert abgefangen und für T einfach 1 eingesetzt");
            T=1.0;
        }
        System.out.println("v eingeben!");
        double v;
        try{
            v=in.nextDouble();
        } catch(InputMismatchException e){
            System.out.println("Ich habe den inkorrekten Wert abgefangen und für v einfach 7,0 eingesetzt");
            v=7.0;
        }
        in.close();

         System.out.println("T hat den Wert "+T);
         System.out.println("v hat den Wert "+v);
    }
}
```

​


----------



## SlaterB (21. Apr 2009)

noch eine Frage offen?


----------



## mefistochen (21. Apr 2009)

Hab das jetzt mal folgender maßen umgeschrieben. Leider funktioniert es jetzt mit dem Fehlerhandeln gar nicht mehr:

```
import java.io.*;
public class Test {

    public static void main(String[] args) {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("T eingeben!");
        double T;
        try {
            String Tstring=in.readLine();
            T = Double.valueOf(Tstring);

        } catch (IOException e) {
            System.out.println("Ich habe den inkorrekten Wert abgefangen und für T einfach 1 eingesetzt");
            T=1.0;
        }
        System.out.println("v eingeben!");
        double v;
        String vstring;
        try{
            vstring=in.readLine();
            v=Double.valueOf(vstring);
        } catch(IOException e){
            System.out.println("Ich habe den inkorrekten Wert abgefangen und für v einfach 7 eingesetzt");
            v=7.0;
        }
        try{
        in.close();
        }
        catch (IOException e){}

         System.out.println("T hat den Wert "+T);
         System.out.println("v hat den Wert "+v);
    }
}
```


----------



## mefistochen (21. Apr 2009)

Eigentlich wollte ich auch den Eingabestandard mit , als Dezimalkomma beibehalten.


----------



## SlaterB (21. Apr 2009)

ich hatte zwar etwas anderes im Sinn (im catch readLine() aufrufen, um den Rest des Scanners bis Enter zu leeren)
aber das sollte genauso klappen, bei mir gehts

was genau funktioniert denn nicht (mehr) bei genau welchen Eingaben?

> Eigentlich wollte ich auch den Eingabestandard mit , als Dezimalkomma beibehalten. 

hat das auch was mit readLine() zu tun?
oder ging das nicht eher vorher auch nicht,

verwende DecimalFormat statt Double.valueOf

edit: oder Scanner.nextDouble hatte das automatisch erkannt, 
dann kann readLine + valueOf wirklich schlechter sein


----------



## mefistochen (21. Apr 2009)

OK:

Mein zuletzt gepostetes Programm läuft genau dann, wenn ich das Dezimalkomma als . eingebe, sonst nicht. Bei dem 1. Programm war es genau umgekehrt.

Eine Beispielfehlerausgabe beim neuen Code ist:

run:
T eingeben!
2,0
Exception in thread "main" java.lang.NumberFormatException: For input string: "2,0"
        at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1242)
        at java.lang.Double.valueOf(Double.java:492)
        at Test.main(Test.java:13)
Java Result: 1
BUILD SUCCESSFUL (total time: 8 seconds)

Hier wird nicht, wie gewünscht, der fehlerhafte Wert umgesetzt.
Beim ursprünglichen Code hat das wenigstens bei der 1. Eingabe funktioniert.

Die andere Idee, bei der ich nur im catch-Block etwas zum Abfangen mache, klingt interessant, da ich dann nahe am ursprünglichen Code bleiben kann.
Wie aber soll das funktionieren. Ich kann auf das Scanner-Objekt namens "in" nicht die Methode readLine() anwenden, denn die kann nur von BufferedReader-Objekten behandelt werden.

[Wie würde das mit dem DecimalFormat funktionieren. Ich habe den Eindruck, die Methode ist zur Umwandlung der verschiedenen Schreibweisen gut, aber nicht unbedingt, um den Rechner einen String in eine Zahl umwandeln zu lassen.]
Aber das letzte ist vielleicht auch nicht so wichtig, da ich es sowieso lieber mit der anderen Methode machen würde.


----------



## SlaterB (21. Apr 2009)

na da heißt das eben
in.nextLine();
..


----------



## Ebenius (21. Apr 2009)

mefistochen hat gesagt.:


> [Wie würde das mit dem DecimalFormat funktionieren. Ich habe den Eindruck, die Methode ist zur Umwandlung der verschiedenen Schreibweisen gut, aber nicht unbedingt, um den Rechner einen String in eine Zahl umwandeln zu lassen.]


Dieser Eindruck täuscht. Einfachstes Beispiel: 
	
	
	
	





```
try {
  final double val =
        NumberFormat.getNumberInstance().parse(inputString).doubleValue();
} catch (ParseException ex) {
  // Fehlerbehandlung hier
}
```
Zum Rest hab ich nix zu sagen. 

Ebenius


----------



## mefistochen (21. Apr 2009)

Ja. So funktionierts.

Vielen Dank!!!


```
import java.util.InputMismatchException;
import java.util.Scanner;
public class Test {

    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        System.out.println("T eingeben!");
        double T;
        try {
            T = in.nextDouble();

        } catch (InputMismatchException e) {
            System.out.println("Ich habe den inkorrekten Wert abgefangen und für T einfach 1 eingesetzt");
            T=1.0;
            in.nextLine();
        }
        System.out.println("v eingeben!");
        double v;
        try{
            v=in.nextDouble();
        } catch(InputMismatchException e){
            System.out.println("Ich habe den inkorrekten Wert abgefangen und für v einfach 7 eingesetzt");
            v=7.0;
            in.nextLine();
        }
         System.out.println("T hat den Wert "+T);
         System.out.println("v hat den Wert "+v);
    }
}
```


----------

