使用java.util.Scanner 验证输入
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了使用java.util.Scanner 验证输入,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含5042字,纯文字阅读大概需要8分钟。
内容图文
参见英文答案 > How to use java.util.Scanner to correctly read user input from System.in and act on it? 1个
我正在使用java.util.Scanner从System.in获取用户输入.我需要验证以下内容的输入:
>它必须是非负数
>它必须是一个按字母顺序排列的字母
> ……等
最好的方法是什么?
解决方法:
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超载
扫描仪能够提供更多功能,因为它是基于正则表达式的.一个重要的功能是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);
这是一个示例会话:
Please enter a positive number!
five
That’s not a number!
-3
Please enter a positive number!
5
Thank you! Got 5
请注意,与更详细的try / catch Integer.parseInt/NumberFormatException组合相比,Scanner.hasNextInt()使用起来要容易得多.通过契约,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方法使扫描仪超越任何输入!你会发现,如果从代码片段中省略这一行,那么它将在无效输入上进入无限循环!
这有两个后果:
>如果您需要跳过未通过hasNextXXX测试的“垃圾”输入,那么您需要以某种方式推进扫描器(例如next(),nextLine(),skip等).
>如果hasNextXXX测试失败,您仍然可以测试它是否具有下一个YYY!
这是执行多个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
exit
请注意,测试的顺序很重要.如果一个Scanner hasNextInt(),那么它也有hasNextLong(),但反过来并不一定如此.通常情况下,您希望在更一般的测试之前进行更具体的测试.
示例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);
这是一个示例会话:
Please enter a vowel, lowercase!
5
That’s not a vowel!
z
That’s not a vowel!
e
Thank you! Got e
在正则表达式中,作为Java字符串文字,模式“[aeiou]”是所谓的“字符类”;它匹配任何字母a,e,i,o,u.请注意,使上述测试不区分大小写非常简单:只需向扫描程序提供此类正则表达式模式即可.
API链接
> hasNext(String pattern) – 如果下一个标记与从指定字符串构造的模式匹配,则返回true.
> java.util.regex.Pattern
相关问题
> Reading a single char in Java
参考
> Java Tutorials/Essential Classes/Regular Expressions
> regular-expressions.info/Character Classes
示例4:一次使用两个扫描仪
有时你需要逐行扫描,在一条线上有多个标记.最简单的方法是使用两个扫描仪,第二个扫描仪从第一个扫描仪获取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);
}
这是一个示例会话:
Give me a bunch of numbers in a line (or ‘exit’)
3 4 5
Sum is 12
10 100 a million dollar
Sum is 110
wait what?
Sum is 0
exit
除了Scanner(String)构造函数之外,还有Scanner(java.io.File)等.
摘要
> Scanner提供了丰富的功能集,例如用于验证的hasNextXXX方法.
>合并使用hasNextXXX / nextXXX意味着扫描程序永远不会抛出InputMismatchException / NoSuchElementException.
>始终记住,hasNextXXX不会使扫描仪超过任何输入.
>如果需要,不要害羞创建多个扫描仪.两个简单的扫描仪通常比一个过于复杂的扫描仪更好.
>最后,即使您没有计划使用高级正则表达式功能,请记住哪些方法是基于正则表达式的,哪些不是.采用String模式参数的任何Scanner方法都是基于regex的.
>提示:将任何字符串转换为文字模式的简单方法是Pattern.quote.
内容总结
以上是互联网集市为您收集整理的使用java.util.Scanner 验证输入全部内容,希望文章能够帮你解决使用java.util.Scanner 验证输入所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。