期望的结果:
- 接受用户输入
- 确保用户一次仅输入 1 个整数值
- 将该整数存储在变量中
我尝试通过执行以下操作来实现此目的:
- 将用户输入存储在变量中
- 计算变量中的标记数量
- 如果没有一个 token ,则拒绝输入
- 如果输入不是数据类型
int
,拒绝输入
代码:
Scanner scan = new Scanner(System.in);
System.out.println("Enter an integer:");
String myString = scan.nextLine();
int tokens = new StringTokenizer(myString, " ").countTokens();
while (tokens != 1 && !scan.hasNextInt()) {
System.out.println("Enter a single integer");
myString = scanner.nextLine();
tokens = new StringTokenizer(myString, " ").countTokens();
}
int number = scanner.nextInt();
System.out.println(number);
这段代码充满了漏洞。输出不一致且不受欢迎。它通常以抛出 java.util.InputMismatchException
结束。错误,表明它尝试存储的值不是 int
。我经历过在一个循环后和多个循环后发生此错误,即使输入类型和数量相同(例如 2 个字符串)也是如此。
我应该继续使用这段代码,还是应该尝试从不同的角度解决这个问题?
最佳答案
我对你的程序做了一些修改。我的方法是接受一行输入。如果输入包含多个标记,请要求用户重新输入。如果只有一个输入,则检查输入是否为整数,如果不是,则用户重新输入。
似乎对我有用:
Scanner scanner = new Scanner(System.in);
String myString;
int tokens;
int number;
do {
System.out.println("Enter a single integer");
myString = scanner.nextLine();
tokens = new StringTokenizer(myString, " ").countTokens();
try {
number = Integer.parseInt(myString);
} catch(NumberFormatException e) {
tokens = 0;
number = -1;
}
}while (tokens != 1);
scanner.close();
System.out.println(number);
Update: Alternate approach without using
StringTokenizer
Scanner scanner = new Scanner(System.in);
String myString;
boolean validInput;
int number;
do {
System.out.println("Enter a single integer");
myString = scanner.nextLine();
try {
number = Integer.parseInt(myString);
validInput = true;
} catch(NumberFormatException e) {
validInput = false;
number = -1;
}
}while (validInput == false);
scanner.close();
System.out.println(number);
Update 2: Another approach using regular expressions to validate input before accepting it.
Scanner
允许我们使用正则表达式来匹配输入。如果输入与模式匹配,则可以使用它来接受输入。否则,丢弃它并要求用户再次提供输入。
代码如下:
Scanner scanner = new Scanner(System.in);
System.out.println("Enter a single integer");
String integerPattern = "[+-]?\\d+$"; // positive or negative and digits only
while(scanner.hasNext(integerPattern) == false) {
String x = scanner.nextLine();// capture and discard input.
System.out.println("Enter a single integer. '" + x + "' is an invalid input.");
}
int number = scanner.nextInt(); // capture input only if it matches pattern.
scanner.close();
System.out.println("number: " + number);
希望这有帮助!
关于java - 使用 Scanner 时确保用户输入是单个整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42129169/