Exception: es dürfen nur Nummern eingelesen werden

LiFunk

Neues Mitglied
Hallo,

ich möchte eine Eingabe programmieren, die nur Zahlen zulässt, das habe ich mit einer Exception realisiert.
Java:
        while(test==true) {
        try {
                test=false;
                System.out.println("Erste Zahl eingeben:");
                a = scan.nextInt();
            }
        catch(InputMismatchException  e) {
                System.out.println("FEHLER: Falsche Eingabe");
                test=true;
            }
        
        }
Wenn eine Zahl eingegeben wird, funktioniert das Verlassen der Schleife. Wenn allerdings keine Zahl eingegeben wird, geht es in catch rein und gibt den Text aus. Dann fragt es wieder nach einer Zahl, hält allerdings nicht an um eine Eingabe zu ermöglichen, sondern läuft jetzt immer weiter im Kreis, also:
FEHLER: ...
Erste Zahl ...
FEHLER: ....
....
Wie lass ich das Programm anhalten um eine Eingabe zu ermöglichen?

Vielen Dank im Vorraus
LiFunk
 

Neumi5694

Top Contributor
Führe im Fehlerfall das hier aus:
[CODE lang="java" title="Next"]scan.next();[/CODE]

Musste selbst erst probieren, ich war der Meinung mit reset() wäre es erledigt, aber man muss genau anders rum dem Scanner sagen, dass er das, was sich schon drin befindet, ignorieren soll.
 
K

kneitzel

Gast
Erst einmal das Verhalten erklärt:

Der Scanner liest aus dem System.in Stream mit den meisten Methoden immer Token für Token aus. Dabei ist der Stream so aufgebaut, dass eine Eingabe immer erst mit der Entertaste gelesen werden kann.

Wenn Du nun etwas wie nextInt aufrufst, dann schaut er nach, ob im Puffer eine Zahl steht. Wenn dies der Fall ist, wird die Zahl gelesen und dann zurück gegeben. Wenn da keine Zahl drin steht, wird auch nichts aus dem Puffer gelesen. Die Zeichen bleiben also weiter im Stream enthalten und jeder folgende Aufruf scheitert erneut.

Daher musst du die illegalen Zeichen aus dem Stream entfernen. Dazu bietet sich nextLine an, denn dies liest die ganze Eingabe bis zum Return ein.

Führe im Fehlerfall das hier aus:
[CODE lang="java" title="Next"]scan.next();[/CODE]

Musste selbst erst probieren, ich war der Meinung mit reset() wäre es erledigt, aber man muss genau anders rum dem Scanner sagen, dass er das, was sich schon drin befindet, ignorieren soll.
Nein, das ist nicht ausreichend. In dem eingegebenen Text können mehrere Token enthalten sein, also wenn z.B. "hallo du" eingegeben wird, dann würde next nur das nächste Token (hallo) auslesen. Daher ist nextLine der korrekte Weg, die Eingabe komplett zu lesen.
 

Neumi5694

Top Contributor
Erst einmal das Verhalten erklärt:

Der Scanner liest aus dem System.in Stream mit den meisten Methoden immer Token für Token aus. Dabei ist der Stream so aufgebaut, dass eine Eingabe immer erst mit der Entertaste gelesen werden kann.

Wenn Du nun etwas wie nextInt aufrufst, dann schaut er nach, ob im Puffer eine Zahl steht. Wenn dies der Fall ist, wird die Zahl gelesen und dann zurück gegeben. Wenn da keine Zahl drin steht, wird auch nichts aus dem Puffer gelesen. Die Zeichen bleiben also weiter im Stream enthalten und jeder folgende Aufruf scheitert erneut.

Daher musst du die illegalen Zeichen aus dem Stream entfernen. Dazu bietet sich nextLine an, denn dies liest die ganze Eingabe bis zum Return ein.


Nein, das ist nicht ausreichend. In dem eingegebenen Text können mehrere Token enthalten sein, also wenn z.B. "hallo du" eingegeben wird, dann würde next nur das nächste Token (hallo) auslesen. Daher ist nextLine der korrekte Weg, die Eingabe komplett zu lesen.
Dann machen wir noch Nägel mit Köpfen und fügen vor der Eingabeaufforderung eine while(scan.hasNext()) Abfrage ein, um auch jede Texteingabe zu ignorieren, die während des Programmstarts oder der Fehlerbehandlung (kann ja sein) gemacht wurde.
Edit: Lieber doch nicht :D Mir ist gerade mein Irrweg klargeworden.
 
K

kneitzel

Gast
Evtl. auch noch der Hinweis: Wenn man möchte, dann kann man das Einlesen eines Token auch generell mit dem "Löschen" weiterer Eingaben verbinden. Das wäre dann Code, der so in der Art aussehen könnte (Stark gekürzt):
Java:
            try {
                scanner.nextInt();
            }
            catch(InputMismatchException e) {
                // ...
            } finally {
                scanner.nextLine();
            }

Das nimmt einem Anwender aber die Möglichkeit, mehrere Dinge sofort einzugeben. Also nehmen wir einfach einmal folgenden Code:
Java:
        Scanner scanner = new Scanner(System.in);
        System.out.print("1. Zahl: ");
        scanner.nextInt();
        System.out.print("2. Zahl: ");
        scanner.nextInt();

Es werden zwei Zahlen abgefragt. Wenn man aber weiss, dass zwei Zahlen abgefragt werden, dann kann man direkt schreiben: "1 2"
Das erste nextInt nimmt die 1 und das zweite nextInt nimmt sich die 2.

So etwas würde durch jede Bereinigung nach dem einlesen eines Token nicht mehr möglich sein. Wenn man den Inhalt des nextLine auswertet, dann könnte man sogar dem Nutzer noch sagen, dass nur die erste Zahl genommen wurde und die 2 verworfen wurde... Man kann da also noch einiges bauen.

Dann machen wir noch Nägel mit Köpfen und fügen vor der Eingabeaufforderung eine while(scan.hasNext()) Abfrage ein, um auch jede Texteingabe zu ignorieren, die während des Programmstarts oder der Fehlerbehandlung (kann ja sein) gemacht wurde.
Das wäre bei einem Programmstart durchaus interessant - würde aber jede Chance nehmen, ein Programm automatisiert laufen zu lassen. Also auf der Shell z.B. einen Aufruf a.la.
java Test < eingabe.txt
 

Neumi5694

Top Contributor
Das wäre bei einem Programmstart durchaus interessant - würde aber jede Chance nehmen, ein Programm automatisiert laufen zu lassen. Also auf der Shell z.B. einen Aufruf a.la.
java Test < eingabe.txt
Und es klappt eh nicht. Mir ist gerade aufgefallen, dass der Befehl nicht ganz das macht, was ich erwartet habe.
Ehrlich gesagt gefällt mir der Gedanke auch recht unsympatische ein User-TextInterface automatisch befüllen zu lassen. Da ist mir die Vorstellung lieber, erst mal die Eingabe zu prüfen und das Interface nur zustarten, wenn nichts da ist.
 
K

kneitzel

Gast
Und es klappt eh nicht. Mir ist gerade aufgefallen, dass der Befehl nicht ganz das macht, was ich erwartet habe.
Ja stimmt, hasNext() wartet auch auf die nächste Eingabe wenn notwendig. Daher kann so eine Schleife nicht wirklich etwas bringen.

So lange es nur um kleine Eingaben geht, kann man auch einfach den Scanner immer neu erstellen. Scanner hat einen internen Buffer von 1024 Zeichen. Dann wäre es einfach etwas wie:
Java:
eingabe = new Scanner(System.in).nextInt();

Mir gefällt die Idee nicht, dass hier ständig neue Instanzen von Scanner erzeugt werden. Und es dürfte Probleme geben, wenn längere Eingaben kommen, da dann nur ein Teil im Buffer des ersten Streams war und dann der nächste ab irgend einem Punkt weiter macht ...

Aber warum ich das so bringe: Diese Form des Aufrufs hatten wir ja im Forum auch schon gesehen. Evtl. wurde Scanner so verwendet um eben diese Problematik mit unerwünschtem Buffer-Inhalt los zu werden.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Exception wird gefangen, aber trotzdem in Error Log? Java Basics - Anfänger-Themen 10
W Null-Pointer Exception beim Programmstart Java Basics - Anfänger-Themen 8
Ostkreuz String Exception Java Basics - Anfänger-Themen 8
Fiedelbambu Exception in Application constructor Java Basics - Anfänger-Themen 3
S leeres Array statt Null Pointer Exception ausgeben Java Basics - Anfänger-Themen 20
F abbruch Exception lässt sich nicht erstellen Java Basics - Anfänger-Themen 2
U Warum kriege ich hier eine nullpointer exception, sehe den Fehler nicht (swing) Java Basics - Anfänger-Themen 1
F Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 11 at main.main(main.java:11) Java Basics - Anfänger-Themen 2
M Exception in thread "main" java.util.NoSuchElementException Java Basics - Anfänger-Themen 2
N Exception beim Verwenden von Arraylist? Java Basics - Anfänger-Themen 10
B Compiler-Fehler Fehlermeldung Exception in thread, falsche Eingabewert Java Basics - Anfänger-Themen 2
S JavaKara Null Exception Error Java Basics - Anfänger-Themen 4
T Eigene Exception - ohne werfen abfangen Java Basics - Anfänger-Themen 2
low_in_the_head Eigene Exception nutzen Java Basics - Anfänger-Themen 4
1 Exception Java Basics - Anfänger-Themen 2
S Kriege Fehler "Exception in thread" beim Benutzen von SubStrings. Java Basics - Anfänger-Themen 2
I JAX-RS Exception Handling Java Basics - Anfänger-Themen 4
L Meine erste eigene Exception Klasse Java Basics - Anfänger-Themen 10
J null exception Array Java Basics - Anfänger-Themen 5
H Frage zu Throw Exception Java Basics - Anfänger-Themen 2
O Exception in thread "main" java.lang.ArithmeticException: / by zero Java Basics - Anfänger-Themen 4
M Wie kann ich bei int-Variablen im exception handler auf bestimmte Strings reagieren? Java Basics - Anfänger-Themen 5
C Exception-Frage Java Basics - Anfänger-Themen 3
B Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException Java Basics - Anfänger-Themen 8
I Exception bei Button mit wait() und notifyAll() Java Basics - Anfänger-Themen 3
N Wie teste ich eine geworfene Exception? Java Basics - Anfänger-Themen 8
R Methoden ArrayList clonen wirft exception Java Basics - Anfänger-Themen 3
D Scanner- Exception NoSuchElementException Java Basics - Anfänger-Themen 2
N Exception werfen bei falscher Datumseingabe Java Basics - Anfänger-Themen 14
A Exception handeling mit finally und objektreferenzen Java Basics - Anfänger-Themen 6
D Frage zu Strings einer Exception Java Basics - Anfänger-Themen 4
S Exception Java Basics - Anfänger-Themen 2
J Exception-Aufgabe Java Basics - Anfänger-Themen 8
S Verwenden von throw Exception an der Funktion Java Basics - Anfänger-Themen 2
R Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException Java Basics - Anfänger-Themen 5
S Compiler-Fehler Exception in thread "main" java.lang.Error: Unresolved compilation problem: Java Basics - Anfänger-Themen 6
Z Fragen zu Exception (Throws/throw) Java Basics - Anfänger-Themen 7
OSchriever Exception für Abbrechen-Schaltfläche JOptionpane Java Basics - Anfänger-Themen 9
J Dateien in Verzeichnissen rekursiv auflisten wirft Exception Java Basics - Anfänger-Themen 4
J Exception unreachable Java Basics - Anfänger-Themen 12
O unchecked Exception Java Basics - Anfänger-Themen 4
P Exception werfen Java Basics - Anfänger-Themen 15
B EJB und Arquillian - bekomme Nullpointer Exception beim Aufruf der EJB Klasse Java Basics - Anfänger-Themen 40
S Exception bei Verwendung von LocalDate Java Basics - Anfänger-Themen 19
I Compiler-Fehler Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5 Java Basics - Anfänger-Themen 3
D Warum die Nullpointer Exception Java Basics - Anfänger-Themen 6
O Exception behandlung einfach Ueben mit Fakt! Java Basics - Anfänger-Themen 10
I OOP Was ist die "Exception Hierarchie" ? Java Basics - Anfänger-Themen 3
U Null Exception aber keine Ahnung warum Java Basics - Anfänger-Themen 5
G Exception und Ausgabe der Duplikate Java Basics - Anfänger-Themen 6
H Try Catch Throw Exception Java Basics - Anfänger-Themen 1
W Exception in Main abfangen oder in der Methode? Java Basics - Anfänger-Themen 10
F Referenz an ein Objekt in einer anderen Klasse erstellen(Nullpointer exception) Java Basics - Anfänger-Themen 6
Mosquera Exception Java Basics - Anfänger-Themen 5
M rekursive division/0 mit exception Java Basics - Anfänger-Themen 18
N Nullpointer exception Java Basics - Anfänger-Themen 4
L Eigene Exception schreiben bei zu langem Array Java Basics - Anfänger-Themen 10
R Exception in thread "main" java.lang.NullPointerException Java Basics - Anfänger-Themen 10
I equals (Override) mit eigener Exception (keine Runtime-Exception) Java Basics - Anfänger-Themen 9
S Array Grenzen-Exception Java Basics - Anfänger-Themen 11
E InputStream im Servlet wirft Exception Java Basics - Anfänger-Themen 5
D Erste Schritte Java.lang.NullPointer.Exception Java Basics - Anfänger-Themen 8
G Arrays out of Bounds exception Java Basics - Anfänger-Themen 2
H Compiler-Fehler Out of Bunce Exception bei einem Char Java Basics - Anfänger-Themen 6
C Compiler-Fehler Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2 Java Basics - Anfänger-Themen 3
C Null Pointer Exception Java Basics - Anfänger-Themen 10
F Klassen Eigene Exception Bedingungen festlegen Java Basics - Anfänger-Themen 2
G Null Pointer Exception Java Basics - Anfänger-Themen 4
GreenTeaYT Exception und zur OOP fragen? Java Basics - Anfänger-Themen 3
O Exception bei Parse-Vorgang Java Basics - Anfänger-Themen 17
T Exception Problem Java Basics - Anfänger-Themen 5
Z Getter/Setter NullPointer Exception Java Basics - Anfänger-Themen 6
W Nullpointer Exception bei .add(...) Java Basics - Anfänger-Themen 6
L Input/Output InputMismatch.Exception Java Basics - Anfänger-Themen 7
B Exception Liste von Liste Java Basics - Anfänger-Themen 3
D Throw Exception Java Basics - Anfänger-Themen 2
MiMa JavaDoc Exception @throws schlagen an Java Basics - Anfänger-Themen 4
J Exception in thread "main" Java Basics - Anfänger-Themen 1
B Exception richtig einbinden Java Basics - Anfänger-Themen 1
M Exception soll Werte mitgeliefert bekommen Java Basics - Anfänger-Themen 12
M Selbstdefinierte Exception Java Basics - Anfänger-Themen 5
B Exception Throwable Java Basics - Anfänger-Themen 11
M Erste Schritte Start Methode - Exception Java Basics - Anfänger-Themen 1
F Operatoren Wieso fliegt hier eine NullPointer Exception :( Java Basics - Anfänger-Themen 3
F nullpointer exception - arrayerstellung Java Basics - Anfänger-Themen 4
K Iterator-Interface implementieren mit Exception Handlung Java Basics - Anfänger-Themen 1
H Erste Schritte Exception: 0 Java Basics - Anfänger-Themen 2
A Exception vs. Testklasse (Programm testen) Java Basics - Anfänger-Themen 2
L Fehler: Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException Java Basics - Anfänger-Themen 4
K Exception nur im "Debug"-Modus und jedem 3.-5. mal Ausführen Java Basics - Anfänger-Themen 3
S Java memory fehler: Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap spa Java Basics - Anfänger-Themen 5
L [JFrame] Exception - woher? Java Basics - Anfänger-Themen 8
N Threads Exception in thread "main"... Feher bei dem Versuch ein Radius zu berechnen Java Basics - Anfänger-Themen 4
R "Missbrauch" von Exception zum Programmfluss Java Basics - Anfänger-Themen 1
U Exception: OutOfMemoryError Java Basics - Anfänger-Themen 11
A Int Eingabe: String mit Exception abfangen. Aber wie? Java Basics - Anfänger-Themen 3
A Code läuft nicht, Fehlermeldung Exception in thread "main" java.lang.Error: Unresolved compilation " Java Basics - Anfänger-Themen 11
V Threads Exception in Thread behandeln Java Basics - Anfänger-Themen 3
F Java exception bei der Ausführung Java Basics - Anfänger-Themen 10
J Exception für String Java Basics - Anfänger-Themen 9

Ähnliche Java Themen

Neue Themen


Oben