43

我有这样的事情:

    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();
4

6 回答 6

45

尝试这个:

in.nextLine();

这会将扫描仪推进到下一行。

于 2012-05-15T15:38:16.807 回答
17

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

于 2012-05-15T15:39:36.957 回答
12

使用以下命令:

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()

希望这可以帮助!

于 2014-08-28T07:35:50.297 回答
7

这应该解决它...

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.");
于 2014-05-06T06:47:20.280 回答
6

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

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

in = new Scanner(System.in);

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

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

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

于 2019-05-07T23:02:46.920 回答
0
scan.nextLine();

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

于 2021-05-11T09:04:11.037 回答