我有一个简单的问题。我一直在探索Java中的基本输入验证(仅接受用户的整数或双精度等。)。下面的代码非常适合简单的应用程序,但是确实激发了我的好奇心。每当您输入一个字母,然后在其后跟一个空格,然后再输入另一个字母时,它将两次显示“请重试。仅输入数字”消息。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("Input Number, BOi");
//Basic input validation. Only Accepts Integers.
while (!sc.hasNextInt()){
sc.next();//This Clears the Scanner for next input
System.out.println("Try again. Input numbers only.");
}
int userInput = sc.nextInt();
System.out.println("CONGRATS! YOU'VE ENTERED THE NUMBER: " +
userInput);
}
}
如果我要输入
p p p
那么结果将是
Try again. Input numbers only.
Try again. Input numbers only.
Try again. Input numbers only.
我希望结果仅Try again. Input numbers only.
显示一次。谁能解释为什么会这样?我听过“ regex”一词,但不知道它是否相关。谢谢!
答案 0 :(得分:0)
您的问题仅仅是对Scanner
的工作原理缺乏了解。
“扫描程序”使用分隔符模式将其输入分为令牌,默认情况下,该模式与空格匹配。
因此,当您输入p p p
时,Scanner.nextInt()
会将p p p
分成p
然后是p
然后是p
。这就是为什么您收到3则相同消息的原因。
使用nextLine()
方法获取整行,而不是“跳过”任何空格。
答案 1 :(得分:0)
这是因为next()
不会占用整行。它只会消耗第一个单词,直到空格,其余的单词都留下为止。
因此,当循环将重复您遇到的单词直到找到int
为止。
例如,您在这里给P P P
意味着3个单词,因此三次迭代
因此,您应该使用:
sc.nextLine()
,如果您期望非整数并对其进行解析sc.nextInt();
并在有人输入其他任何内容时处理异常
比int