繁体   English   中英

如何清除 Java 中的扫描仪缓冲区?

[英]How can I clear the Scanner buffer in Java?

我有这样的事情:

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

如何清除缓冲区?

编辑:我尝试了以下操作,但由于某种原因它不起作用:

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

试试这个:

in.nextLine();

这使扫描仪前进到下一行。

您不能明确清除扫描仪的缓冲区。 在内部,它可能会在读取令牌后清除缓冲区,但这是 porgrammers 无法触及的实现细节。

使用以下命令:

in.nextLine();

紧接着

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

或在以下大括号之后(您对此有何评论)。

这个命令将扫描器推进到下一行(从文件或字符串读取时,这只是读取下一行),从而在这种情况下基本上刷新它。 它清除缓冲区并为新的输入准备扫描仪。 当用户输入无效输入(例如要求输入数字时的字母)时,它可以优选地用于清除当前缓冲区。

该方法的文档可以在这里找到: http : //docs.oracle.com/javase/7/docs/api/java/util/Scanner.html#nextLine()

希望这可以帮助!

这应该解决它...

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

其他人建议使用in.nextLine()清除缓冲区,这适用于单行输入。 然而,正如评论指出的那样,有时 System.in 输入可以是多行的。

如果您使用的是 System.in 而不是其他一些 InputStream,您可以创建一个新的 Scanner 对象,在其中清除缓冲区。

in = new Scanner(System.in);

如果你这样做,不要先调用in.close() 这样做将关闭 System.in,因此您将在后续调用in.nextInt();获得 NoSuchElementExceptions in.nextInt(); System.in 可能不应该在您的程序中关闭。

(上述方法特定于 System.in。它可能不适用于其他输入流。)

如果您确实需要在创建新对象之前关闭 Scanner 对象,则此 StackOverflow 答案建议为 System.in 创建一个 InputStream 包装器,该包装器具有自己的 close() 方法,该方法不会关闭包装的 System.in 流。 不过,这对于简单的程序来说太过分了。

scan.nextLine();

在读取字符串输入之前放置上面的行

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM