我有这样的事情:
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();
答案 0 :(得分:28)
试试这个:
in.nextLine();
这使扫描仪进入下一行。
答案 1 :(得分:8)
您无法明确清除扫描仪的缓冲区。在内部,它可能会在读取令牌后清除缓冲区,但这是在porgrammers的范围之外的实现细节。
答案 2 :(得分:5)
这应该解决它......
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.");
答案 3 :(得分:5)
使用以下命令:
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()
希望这有帮助!
答案 4 :(得分:0)
其他人建议使用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对象,则this StackOverflow answer建议为System.in创建一个InputStream包装器,该包装器具有自己的close()方法,该方法不会关闭包装的System.in。流。不过,对于简单的程序来说,这太过分了。
答案 5 :(得分:-1)
scan.nextLine();
在读取字符串输入之前放置上面一行