Scanner.hasNextXXX 方法概述
java.util.Scanner 有许多 hasNextXXX 方法可用于验证输入。以下是所有这些的简要概述:
Scanner 具有更多功能,因为它基于正则表达式。一个重要的特性是useDelimiter(String pattern),它可以让你定义什么pattern 分隔你的标记。还有find 和skip 方法忽略 分隔符。
以下讨论将使正则表达式尽可能简单,因此重点仍然是Scanner。
示例 1:验证正整数
这是一个简单的例子,使用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 个
请注意,与更冗长的 try/catch Integer.parseInt/NumberFormatException 组合相比,Scanner.hasNextInt() 的使用要容易得多。根据合同,Scanner保证如果它是hasNextInt(),那么nextInt() 将和平地给你int,并且不会抛出任何NumberFormatException /InputMismatchException/NoSuchElementException.
相关问题
示例 2:多个hasNextXXX 在同一个令牌上
请注意,上面的 sn-p 包含一个 sc.next() 语句以将 Scanner 推进到 hasNextInt()。重要的是要意识到没有一个 hasNextXXX 方法会推进 Scanner 超过任何输入!你会发现,如果你在 sn-p 中省略这一行,那么它会在输入无效时进入无限循环!
这有两个后果:
- 如果您需要跳过未通过
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
假
(布尔)假
废话
(字符串)废话
1.1
(双) 1.1
100000000000
(长)100000000000
退出
请注意,测试的顺序很重要。如果是ScannerhasNextInt(),那么它也是hasNextLong(),但反过来不一定是true。通常,您希望在进行更一般的测试之前进行更具体的测试。
示例 3:验证元音
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
那不是元音!
电子
谢谢!明白了
在正则表达式中,作为Java 字符串文字,模式"[aeiou]" 就是所谓的“字符类”;它匹配任何字母a、e、i、o、u。请注意,使上述测试不区分大小写是微不足道的:只需将此类正则表达式模式提供给 Scanner。
API 链接
相关问题
参考文献
示例 4:一次使用两个 Scanner
有时您需要逐行扫描,一行上有多个标记。最简单的方法是使用 two Scanner,其中第二个 Scanner 将来自第一个 Scanner 的 nextLine() 作为输入。这是一个例子:
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
退出
除了Scanner(String)构造函数,还有Scanner(java.io.File)等等。
总结
-
Scanner 提供了一组丰富的功能,例如用于验证的hasNextXXX 方法。
- 正确组合使用
hasNextXXX/nextXXX 意味着Scanner 将绝不抛出InputMismatchException/NoSuchElementException。
- 永远记住
hasNextXXX 不会使Scanner 超过任何输入。
- 如有必要,不要害羞地创建多个
Scanner。两个简单的Scanner 通常比一个过于复杂的Scanner 要好。
- 最后,即使您没有任何使用高级正则表达式功能的计划,请记住哪些方法是基于正则表达式的,哪些不是。任何采用
String pattern 参数的Scanner 方法都是基于正则表达式的。