一尘不染

如何使用java.util.Scanner验证输入?

java Scanner

我是从记录用户输入System.in使用java.util.Scanner。我需要验证输入内容,例如:

必须为非负数
它必须是字母
…等等

最好的方法是什么?


阅读 624

收藏
2020-01-10

共1个答案

一尘不染

示例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

请注意Scanner.hasNextInt(),与更详细try/catch Integer.parseInt/ NumberFormatException组合相比,使用起来要容易得多。通过合同,一个Scanner 保证,如果它hasNextInt(),然后nextInt()将安静地给你int,并不会引发任何NumberFormatException/ InputMismatchException/ NoSuchElementException

示例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
(int) 5
false
(boolean) false
blah
(String) blah
1.1
(double) 1.1
100000000000
(long) 100000000000
exit

请注意,测试顺序很重要。如果是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);

输出结果:

Please enter a vowel, lowercase!
5
That's not a vowel!
z
That's not a vowel!
e
Thank you! Got e
2020-01-10