Hoe kan ik de scannerbuffer in Java wissen?

Ik heb zoiets als dit:

   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.");

Hoe kan ik de buffer wissen?

Bewerken: ik heb het volgende geprobeerd, maar het werkt om de een of andere reden niet:

while(in.hasNext())
    in.next();

Antwoord 1, autoriteit 100%

U kunt de buffer van Scanner niet expliciet wissen. Intern kan het de buffer wissen nadat een token is gelezen, maar dat is een implementatiedetail dat buiten het bereik van de programmeurs ligt.


Antwoord 2, autoriteit 99%

Probeer dit:

in.nextLine();

Hiermee gaat de scanner naar de volgende regel.


Antwoord 3, autoriteit 71%

Gebruik het volgende commando:

in.nextLine();

direct na

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

of na de volgende accolade (waar uw opmerking hierover staat).

Met deze opdracht gaat de scanner naar de volgende regel (bij het lezen van een bestand of tekenreeks leest dit gewoon de volgende regel), waardoor deze in dit geval in wezen wordt leeggemaakt. Het wist de buffer en maakt de scanner klaar voor een nieuwe invoer. Het kan bij voorkeur worden gebruikt om de huidige buffer te wissen wanneer een gebruiker een ongeldige invoer heeft ingevoerd (zoals een letter wanneer om een nummer wordt gevraagd).

Documentatie van de methode is hier te vinden:
http://docs.oracle.com /javase/7/docs/api/java/util/Scanner.html#nextLine()

Hopelijk helpt dit!


Antwoord 4, autoriteit 47%

Dit zou het moeten oplossen…

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.");

Antwoord 5, autoriteit 41%

Andere mensen hebben voorgesteld om in.nextLine()te gebruiken om de buffer te wissen, wat werkt voor invoer met één regel. Zoals opmerkingen echter aangeven, kan de System.in-invoer soms uit meerdere regels bestaan.

U kunt in plaats daarvan een nieuw Scanner-object maken waarin u de buffer wilt wissen als u System.in gebruikt en niet een andere InputStream.

in = new Scanner(System.in);

Als je dit doet, nietbel dan eerst in.close(). Als u dit doet, wordt System.in gesloten en krijgt u NoSuchElementExceptions bij volgende aanroepen van in.nextInt();System.in moet waarschijnlijk niet worden gesloten tijdens uw programma.

(De bovenstaande benadering is specifiek voor System.in. Het is mogelijk niet geschikt voor andere invoerstromen.)

Als u uw Scanner-object echt moet sluiten voordat u een nieuwe maakt, dit StackOverflow-antwoordstelt voor om een InputStream-wrapper voor System.in te maken die zijn eigen close()-methode heeft die de verpakte System.in-stroom niet sluit. Dit is echter overkill voor eenvoudige programma’s.


Antwoord 6

scan.nextLine();

Zet de bovenstaande regel voordat u String invoer leest

Other episodes