Scanner.hasNextXXX
方法概述
java.util.Scanner
有许多hasNextXXX
方法可用于验证输入。这是所有这些的简要概述:
hasNext()
-它根本没有任何令牌吗?
hasNextLine()
-是否有另一行输入?
对于Java原语
hasNextInt()
-它具有可以解析为int
的令牌吗?
还提供hasNextDouble()
,hasNextFloat()
,hasNextByte()
,hasNextShort()
,hasNextLong()
和hasNextBoolean()
作为奖励,还有hasNextBigInteger()
和hasNextBigDecimal()
整数类型还具有重载以指定基数(例如十六进制)
基于正则表达式
hasNext(String pattern)
hasNext(Pattern pattern)
是Pattern.compile
重载
Scanner
具有更多功能,这是基于正则表达式的。 useDelimiter(String 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
请注意,与更详细的
Scanner.hasNextInt()
try/catch
/
Integer.parseInt
组合相比,使用
NumberFormatException
更加容易。根据合同,
Scanner
保证如果
hasNextInt()
,则
nextInt()
会和平地给您
int
,并且不会抛出任何
NumberFormatException
/
InputMismatchException
/
NoSuchElementException
。
相关问题
How to use Scanner to accept only valid int as input How do I keep a scanner from throwing exceptions when the wrong type is entered? (java) 示例2:同一令牌上有多个
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
(整数)5
假
(布尔值)假
等等
(弦)等等
1.1
(双)1.1
100000000000
(长)100000000000
出口
请注意,测试顺序很重要。如果是
Scanner
hasNextInt()
,那么它也是
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
那不是元音!
ž
那不是元音!
Ë
谢谢!有
在正则表达式中,模式
"[aeiou]"
作为Java字符串文字,称为“字符类”。它与任何字母
a
,
e
,
i
,
o
,
u
匹配。请注意,使上述测试不区分大小写是微不足道的:只需向
Scanner
提供此类正则表达式模式。
API链接
hasNext(String pattern)
-如果下一个标记与从指定字符串构造的模式匹配,则返回
true
。
java.util.regex.Pattern
相关问题
Reading a single char in Java参考文献
Java Tutorials/Essential Classes/Regular Expressionsregular-expressions.info/Character Classes示例4:一次使用两个
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
10100万美元
总和是110
等等什么?
总和为0
出口
除了
Scanner(String)
构造函数外,还有
Scanner(java.io.File)
。
摘要
Scanner
提供了一组丰富的功能,例如
hasNextXXX
验证方法。
正确组合使用
hasNextXXX/nextXXX
意味着
Scanner
绝不会抛出
InputMismatchException
/
NoSuchElementException
。
始终记住,
hasNextXXX
不会使
Scanner
超出任何输入。
如有必要,不要害羞创建多个
Scanner
。两个简单的
Scanner
通常比一个过于复杂的
Scanner
更好。
最后,即使您没有使用高级正则表达式功能的计划,也请记住哪些方法是基于正则表达式的,哪些不是。任何采用
Scanner
参数的
String pattern
方法都是基于正则表达式的。
提示:将任何
String
转换为文字模式的一种简单方法是对其进行
Pattern.quote
处理。