it-swarm.com.de

Wie kann ich den Scannerpuffer in Java löschen?

Ich habe so etwas:

    Scanner in=new Scanner(System.in);
    int rounds = 0;
    while (rounds < 1 || rounds > 3) {
        System.out.print("How many rounds? ");
        if (in.hasNextInt()) {
            rounds = in.nextInt();
        } else {
            System.out.println("Invalid input. Please try again.");
            System.out.println();
        }
        // Clear buffer
    }
    System.out.print(rounds+" rounds.");

Wie kann ich den Puffer löschen?

Edit: Ich habe folgendes versucht, aber es funktioniert aus irgendeinem Grund nicht

while(in.hasNext())
    in.next();
21
Leo Jiang

Sie können den Puffer des Scanners nicht explizit löschen. Intern wird der Puffer möglicherweise gelöscht, nachdem ein Token gelesen wurde. Dies ist jedoch ein Implementierungsdetail außerhalb der Reichweite der Benutzer.

8
Óscar López

Versuche dies:

in.nextLine();

Dadurch wird der Scanner in die nächste Zeile verschoben.

26
Makoto

Verwenden Sie den folgenden Befehl: 

in.nextLine();

gleich nach

System.out.println("Invalid input. Please Try Again.");
System.out.println();

oder nach der folgenden geschweiften Klammer (wo sich Ihr Kommentar dazu befindet).

Mit diesem Befehl wird der Scanner in die nächste Zeile verschoben (beim Lesen aus einer Datei oder einem String wird einfach die nächste Zeile gelesen), was in diesem Fall im Wesentlichen geleert wird. Es löscht den Puffer und bereitet den Scanner für eine neue Eingabe vor. Sie kann vorzugsweise zum Löschen des aktuellen Puffers verwendet werden, wenn ein Benutzer eine ungültige Eingabe eingegeben hat (z. B. einen Buchstaben, wenn Sie nach einer Nummer gefragt werden). 

Eine Dokumentation der Methode finden Sie hier: http://docs.Oracle.com/javase/7/docs/api/Java/util/Scanner.html#nextLine ()

Hoffe das hilft!

5

Das sollte es beheben ...

Scanner in=new Scanner(System.in);
    int rounds = 0;
    while (rounds < 1 || rounds > 3) {
        System.out.print("How many rounds? ");
        if (in.hasNextInt()) {
            rounds = in.nextInt();
        } else {
            System.out.println("Invalid input. Please try again.");
            in.next(); // -->important
            System.out.println();
        }
        // Clear buffer
    }
    System.out.print(rounds+" rounds.");
5
rejun

Andere Leute haben vorgeschlagen, in.nextLine() zu verwenden, um den Puffer zu löschen, der bei einzeiliger Eingabe funktioniert. Wie aus den Kommentaren hervorgeht, kann die Eingabe in System.in jedoch manchmal mehrzeilig sein.

Sie können stattdessen ein neues Scannerobjekt erstellen, in dem Sie den Puffer löschen möchten, wenn Sie System.in und keinen anderen InputStream verwenden.

in = new Scanner(System.in);

Wenn Sie dies tun, rufen Sie nicht zuerst in.close() auf. Dadurch wird System.in geschlossen, und Sie erhalten NoSuchElementExceptions bei nachfolgenden Aufrufen von in.nextInt();. System.in sollte während Ihres Programms wahrscheinlich nicht geschlossen werden.

(Der obige Ansatz ist spezifisch für System.in. Er ist möglicherweise nicht für andere Eingabestreams geeignet.)

Wenn Sie Ihr Scanner-Objekt wirklich schließen müssen, bevor Sie ein neues erstellen, schlägt diese StackOverflow-Antwort vor, einen InputStream-Wrapper für System.in zu erstellen, der über eine eigene close () -Methode verfügt, mit der das umschlossene System nicht geschlossen wird .in Stream. Dies ist jedoch für einfache Programme übertrieben.

0
SansWit

Das funktioniert für mich. Es ist nicht absolut zuverlässig, weil verfügbar () nur eine Schätzung ist, aber ich möchte nur die meisten Eingaben löschen, nachdem ein Benutzer eine Taste gedrückt gehalten hat, um die Wiederholung zu ermöglichen. Ich habe nichts dagegen, ein oder zwei zusätzliche Charaktere zu bekommen.

        System.in.skip(System.in.available());
0
trindflo