使用java.util.Scanner验证输入

bha*_*shi 39 java validation java.util.scanner

我正在System.in使用一个用户输入java.util.Scanner.我需要验证以下内容的输入:

  • 它必须是非负数
  • 它必须是按字母顺序排列的字母
  • ......等

最好的方法是什么?

pol*_*nts 138

Scanner.hasNextXXX方法概述

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

Scanner因为它是基于正则表达式的事实所以能够做得更多.一个重要的特性是useDelimiter(String pattern),它允许您定义分隔您的标记的模式.也有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);
Run Code Online (Sandbox Code Playgroud)

这是一个示例会话:

请输入正数!
5
这不是一个数字!
-3
请输入正数!
5
谢谢!得到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()
    );
}
Run Code Online (Sandbox Code Playgroud)

这是一个示例会话:

5
(int)5
false
(布尔值)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);
Run Code Online (Sandbox Code Playgroud)

这是一个示例会话:

请输入一个小写的元音!
5
那不是元音!
ž
这不是一个元音!
Ë
谢谢!得到了

在正则表达式中,作为Java字符串文字,模式"[aeiou]"是所谓的"字符类"; 它匹配任何字母a,e,i,o,u.请注意,使上面的测试不区分大小写是微不足道的:只需提供这样的正则表达式模式Scanner.

API链接

相关问题

参考


例4:Scanner一次使用两个

有时你需要逐行扫描,在一条线上有多个标记.做到这一点的最简单方法是使用2 Scanner,其中第二ScannernextLine()从所述第一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);
}
Run Code Online (Sandbox Code Playgroud)

这是一个示例会话:

给我一堆数字(或'退出')
3 4 5
总和是12
10 100百万美元
总和是
等待什么?
Sum是0
退出

除了Scanner(String)构造函数之外,还有Scanner(java.io.File)其他一些.


摘要

  • Scanner提供了丰富的功能,例如hasNextXXX验证方法.
  • 正确使用hasNextXXX/nextXXX组合意味着,Scanner永远不会抛出InputMismatchException/ NoSuchElementException.
  • 永远记住,hasNextXXX不会推进Scanner过去的任何输入.
  • Scanner如果有必要,不要害羞创建多个.两个简单Scanner往往比一个过于复杂Scanner.
  • 最后,即使您没有任何计划使用高级正则表达式功能,请记住哪些方法是基于正则表达式的,哪些不是.任何ScannerString pattern参数的方法都是基于regex的.
    • 提示:将任何内容String转换为文字模式的简单方法就是Pattern.quote它.

  • @bhavna:从代码中学习并自己完成剩下的工作. (4认同)
  • @bhavna,请停止期待别人做你**工作.此外,不时感谢某人也不会受伤. (4认同)

Dyl*_*lan 7

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

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