使用 java.util.Scanner 验证输入

2022-08-31 20:02:19

我正在从使用 .我需要验证以下各项的输入:System.injava.util.Scanner

  • 它必须是非负数
  • 它必须是字母
  • ...等

最好的方法是什么?


答案 1

方法概述Scanner.hasNextXXX

java.util.Scanner 有许多可用于验证输入的方法。以下是所有这些的简要概述:hasNextXXX

Scanner能够更多,因为它是基于正则表达式的。一个重要的功能是使用Delimiter(字符串模式),它允许您定义分隔令牌的模式。还有一些方法可以忽略分隔符。findskip

以下讨论将使正则表达式尽可能简单,因此重点仍放在 .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

请注意,与更冗长的 Integer.parseInt/NumberFormatException 组合相比,使用起来要容易得多。根据合同,a保证如果它,那么会和平地给你,并且不会抛出任何//。Scanner.hasNextInt()try/catchScannerhasNextInt()nextInt()intNumberFormatExceptionInputMismatchExceptionNoSuchElementException

相关问题


示例 2:同一令牌上的多个hasNextXXX

请注意,上面的代码段包含一个语句,用于推进 直到它。重要的是要意识到,没有种方法会推进过去的任何输入!你会发现,如果你从片段中省略这一行,那么它会在无效输入上进入无限循环!sc.next()ScannerhasNextInt()hasNextXXXScanner

这会产生两个后果:

  • 如果您需要跳过未通过测试的“垃圾”输入,则需要以这种或那种方式(例如,等)前进。hasNextXXXScannernext()nextLine()skip
  • 如果一个测试失败,你仍然可以测试它是否可能!hasNextXXXhasNextYYY

下面是执行多个测试的示例。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 ,那么它也是 ,但它不一定是相反的。通常情况下,您希望在更一般的测试之前进行更具体的测试。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
那不是元音!
e
谢谢!得到 e

在正则表达式中,作为Java字符串文本,该模式是所谓的“字符类”;它匹配任何字母 、 、 、 、 。请注意,使上述测试用例不敏感是微不足道的:只需向 ."[aeiou]"aeiouScanner

接口链接

相关问题

引用


示例 4:一次使用两个Scanner

有时您需要逐行扫描,一行上有多个令牌。实现此目的的最简单方法是使用两个,其中第二个从第一个中获取输入。下面是一个示例:ScannerScannernextLine()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
  • 组合的正确用法意味着 a 永远不会抛出一个 /。hasNextXXX/nextXXXScannerInputMismatchExceptionNoSuchElementException
  • 永远记住,不会推进过去的任何输入。hasNextXXXScanner
  • 如有必要,不要害羞地创建多个。两个简单往往比一个过于复杂好。ScannerScannerScanner
  • 最后,即使您没有任何计划使用高级正则表达式功能,也请记住哪些方法基于正则表达式,哪些不是。任何采用参数的方法都是基于正则表达式的。ScannerString pattern
    • 提示:将任何内容转换为文字模式的一种简单方法是 Pattern.quote it。String

答案 2

这是一种极简主义的方法。

System.out.print("Please enter an integer: ");
while(!scan.hasNextInt()) scan.next();
int demoInt = scan.nextInt();

推荐