使用 java.util.Scanner 验证输入
我正在从使用 .我需要验证以下各项的输入:System.in
java.util.Scanner
- 它必须是非负数
- 它必须是字母
- ...等
最好的方法是什么?
我正在从使用 .我需要验证以下各项的输入:System.in
java.util.Scanner
最好的方法是什么?
Scanner.hasNextXXX
java.util.Scanner
有许多可用于验证输入的方法。以下是所有这些的简要概述:hasNextXXX
hasNext()
- 它有任何令牌吗?hasNextLine()
- 它是否有另一行输入?hasNextInt()
- 它是否有可以解析为?int
hasNextDouble()
、hasNextFloat()
、hasNextByte()
、hasNextShort()
、hasNextLong()
和 hasNextBoolean()
NextBigInteger()
和NextBigDecimal()
Scanner
能够更多,因为它是基于正则表达式的。一个重要的功能是使用Delimiter(字符串模式),
它允许您定义分隔令牌的模式。还有一些方法可以忽略分隔符。find
skip
以下讨论将使正则表达式尽可能简单,因此重点仍放在 .Scanner
下面是一个用于验证输入正数的简单示例。hasNextInt()
int
Scanner sc = new Scanner(System.in);
int number;
do {
System.out.println("Please enter a positive number!");
while (!sc.hasNextInt()) {
System.out.println("That's not a number!");
sc.next(); // this is important!
}
number = sc.nextInt();
} while (number <= 0);
System.out.println("Thank you! Got " + number);
下面是一个示例会话:
请输入正数!
五
这不是一个数字!
-3
请输入一个正数!
5
谢谢!得到 5
请注意,与更冗长的 Integer.parseInt
/NumberFormatException
组合相比,使用起来要容易得多。根据合同,a保证如果它,那么会和平地给你,并且不会抛出任何//。Scanner.hasNextInt()
try/catch
Scanner
hasNextInt()
nextInt()
int
NumberFormatException
InputMismatchException
NoSuchElementException
hasNextXXX
请注意,上面的代码段包含一个语句,用于推进 直到它。重要的是要意识到,没有一种方法会推进过去的任何输入!你会发现,如果你从片段中省略这一行,那么它会在无效输入上进入无限循环!sc.next()
Scanner
hasNextInt()
hasNextXXX
Scanner
这会产生两个后果:
hasNextXXX
Scanner
next()
nextLine()
skip
hasNextXXX
hasNextYYY
下面是执行多个测试的示例。hasNextXXX
Scanner sc = new Scanner(System.in);
while (!sc.hasNext("exit")) {
System.out.println(
sc.hasNextInt() ? "(int) " + sc.nextInt() :
sc.hasNextLong() ? "(long) " + sc.nextLong() :
sc.hasNextDouble() ? "(double) " + sc.nextDouble() :
sc.hasNextBoolean() ? "(boolean) " + sc.nextBoolean() :
"(String) " + sc.next()
);
}
下面是一个示例会话:
5
(int) 5
false
(boolean) false
blah
(String) blah
1.1
(double) 1.1
100000000000
(long) 100000000000 退出
请注意,测试的顺序很重要。如果是 a ,那么它也是 ,但它不一定是相反的。通常情况下,您希望在更一般的测试之前进行更具体的测试。Scanner
hasNextInt()
hasNextLong()
true
Scanner
具有正则表达式支持的许多高级功能。下面是使用它来验证元音的示例。
Scanner sc = new Scanner(System.in);
System.out.println("Please enter a vowel, lowercase!");
while (!sc.hasNext("[aeiou]")) {
System.out.println("That's not a vowel!");
sc.next();
}
String vowel = sc.next();
System.out.println("Thank you! Got " + vowel);
下面是一个示例会话:
请输入一个元音,小写!
5
那不是元音!
z
那不是元音!
e
谢谢!得到 e
在正则表达式中,作为Java字符串文本,该模式是所谓的“字符类”;它匹配任何字母 、 、 、 、 。请注意,使上述测试用例不敏感是微不足道的:只需向 ."[aeiou]"
a
e
i
o
u
Scanner
hasNext(字符串模式)
- 如果下一个令牌与从指定字符串构造的模式匹配,则返回。true
java.util.regex.Pattern
Scanner
有时您需要逐行扫描,一行上有多个令牌。实现此目的的最简单方法是使用两个,其中第二个从第一个中获取输入。下面是一个示例:Scanner
Scanner
nextLine()
Scanner
Scanner sc = new Scanner(System.in);
System.out.println("Give me a bunch of numbers in a line (or 'exit')");
while (!sc.hasNext("exit")) {
Scanner lineSc = new Scanner(sc.nextLine());
int sum = 0;
while (lineSc.hasNextInt()) {
sum += lineSc.nextInt();
}
System.out.println("Sum is " + sum);
}
下面是一个示例会话:
给我一堆数字在一行(或“退出”)
3 4 5
总和是12
10 100 一百万美元
总和是110
等等?
总和为 0
退出
除了Scanster(String)
构造函数之外,还有Scanster(java.io.File)
等。
Scanner
提供了一组丰富的功能,例如用于验证的方法。hasNextXXX
hasNextXXX/nextXXX
Scanner
InputMismatchException
NoSuchElementException
hasNextXXX
Scanner
Scanner
Scanner
Scanner
Scanner
String pattern
Pattern.quote
it。String
这是一种极简主义的方法。
System.out.print("Please enter an integer: ");
while(!scan.hasNextInt()) scan.next();
int demoInt = scan.nextInt();