Input/Output java.util.Scanner in einer Schleife und Exception-Behandlung: Einlesen einer Zahl

  • Themenstarter Themenstarter phip1611
  • Beginndatum Beginndatum
P

phip1611

Gast
Moin.
Ich möchte eine Zahl über die Konsole mit java.util.Scanner einlesen. Damit solange Eingaben erfolgen, bis eine davon valide ist, läuft das ganze in einer Schleife. Wenn aber im 1. Schleifendurchlauf die Exception eintritt, wird in JEDEM weiteren Durchlauf automatisch der catch(){}-block ausgeführt und der try{}-block übersprungen. Wie kann ich das elegant umgehen? Es funktioniert, wenn ich in jedem Schleifendurchlauf ein neues Objekt anlege, aber das ist irgendwie unsauberer Stil, oder?
Java:
public static long nextNaturalNumberAsLongInput() {
        long l;
        java.util.Scanner input;
        input = new java.util.Scanner(System.in);
        l=-1;//Schleife wird wiederholt, bis natürliche Zahl eingegeben wurde
        do {
            try {
                l = input.nextLong();
            } catch (InputMismatchException e) {
                /* wenn im ersten schleifendurchlauf exception ausgelöst wird
                   wird in JEDEM weiteren Durchlauf automatisch der catch(){}-block genommen
                  und der try{}-block übersprungen
                 */
                System.out.println("Bitte eine natürliche Zahl eingeben!");
            }
        } while(l<0);
        return l;
    }
 
Dein Problem ist:

Java-API für java.util.Scanner.nextLong():
This method will throw InputMismatchException if the next token cannot be translated into a valid long value as described below. If the translation is successful, the scanner advances past the input that matched.

Scanner geht also nicht über den "next token", wenn es kein long ist.
Du musst also den "next token" überspringen, bevor du erneut einen .nextLong() anfragen kannst.
Dann schauen wir doch mal, was "überspringen" auf englisch heißt... "skip".
Und rate mal, was in der Java-API Scanner sonst noch für Funktionen anbietet, v.a. beginnend mit einem 's'...

Alternativ geht wohl auch (in deinem einfachen Fall) .next(), da braucht man sich keine Gedanken um Pattern/Reguläre Ausdrücke machen.
 
Zuletzt bearbeitet:
Noch eine kleine Mini-Anmerkung: Der Benutzer darf bei dir auch 0 eingeben, was aber keine "Natürliche Zahl" ist - die beginnen erst bei 1 ...
 

Neue Themen


Zurück
Oben