使用 java.util.Scanner [duplicate] 验证输入

Validating input using java.util.Scanner [duplicate]

提问人:bhavna raghuvanshi 提问时间:6/17/2010 最后编辑:skaffmanbhavna raghuvanshi 更新时间:4/16/2017 访问量:396269

问:

我正在使用用户输入。我需要验证以下内容的输入:System.injava.util.Scanner

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

最好的方法是什么?

Java 验证 java.util.scanner

评论

12赞 Bart Kiers 6/17/2010
你的许多问题都是这样的:措辞不当的恳求别人发布代码,而你却没有展示你自己做了什么(或尝试过)。这不是学习新事物的方式。弄脏你的手!自己尝试几件事,当卡在某个地方时,在这里发布一个特定的问题(并发布不起作用的代码)。我向你们保证,通过这样做,你们将得到比这些接近的投票更好的回应。
1赞 polygenelubricants 6/17/2010
@Bart K:如果为了改进问题以使其值得重新打开,我对其进行编辑以询问如何使用 ?根据 OP 之前的 Q,这似乎是 OP 正在处理的问题。ScannerScanner
0赞 Bart Kiers 6/17/2010
@polygenelubricants,是的,如果这个问题被重新表述,让它更有意义,我会投票重新讨论。如果从长远来看,这个问题会被删除,那将是一种耻辱(以及所有好的答案(主要是你的))。当然,我希望@bhavna自己会尝试改进它......
0赞 polygenelubricants 6/17/2010
@Bart K:编辑完成。也将进一步改善我的答案。如果其他回答者认为这不公平,请向他们道歉。
1赞 Daniel Vassallo 6/21/2010
令人难以置信的是,这个问题已经收集了 2 张删除票。重新。

答:

166赞 polygenelubricants 6/17/2010 #1

方法概述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);

下面是一个示例会话:

请输入正数!

这不是一个数字!
-3
请输入正数!

5 谢谢!得到 5

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

相关问题


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

请注意,上面的代码片段包含一个语句,用于推进 until it .重要的是要认识到,没有一种方法可以超越任何输入!您会发现,如果您从代码片段中省略这一行,那么它将在无效输入上进入无限循环!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 (字符串) blah

1.1 (double) 1.1
100000000000 (long)
1000000000000

exit

请注意,测试的顺序很重要。如果是 ,那么它也是 ,但不一定是相反的。通常情况下,您希望在更一般的测试之前进行更具体的测试。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

API 链接

相关问题

引用


示例 4:一次使用两个Scanner

有时,您需要逐行扫描,并在一行上使用多个令牌。实现此目的的最简单方法是使用 2 ,其中 second 将 from first 作为输入。下面是一个示例: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
退出

除了 Scanner(String) 构造函数之外,还有 Scanner(java.io.File) 等。


总结

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

评论

0赞 bhavna raghuvanshi 6/17/2010
此代码适用于负数,但不适用于字母表
0赞 mahju 6/17/2010
当然,这可能是最好的方法,这取决于输入法。
5赞 polygenelubricants 6/17/2010
@bhavna:从代码中学习,剩下的就自己做。
4赞 Bart Kiers 6/17/2010
@bhavna,请不要指望别人做所有的工作。此外,时不时地感谢某人也不会有什么坏处。
0赞 Meow 2/6/2013
我喜欢 hasNextInt()。我一直在处理 NumberFormatException,因为我没有充分阅读文档。哎哟。谢谢你的信息。也很好的例子。
0赞 mahju 6/17/2010 #2

如果要从控制台或类似方式解析字符串数据,最好的方法是使用正则表达式。在此处阅读更多相关信息:http://java.sun.com/developer/technicalArticles/releases/1.4regex/

否则,要从字符串中解析 int,请尝试 Integer.parseInt(string)。如果字符串不是数字,则会出现异常。然后,您可以对该值执行检查,以确保它不是负数。

String input;
int number;
try
{
    number = Integer.parseInt(input);
    if(number > 0)
    {
        System.out.println("You positive number is " + number);
    }
} catch (NumberFormatException ex)
{
     System.out.println("That is not a positive number!");
}

要获取纯字符字符串,最好使用Character.isLetter(char)等方式遍历每个字符来检查数字。

String input
for(int i = 0; i<input.length(); i++)
{
   if(!Character.isLetter(input.charAt(i)))
   {
      System.out.println("This string does not contain only letters!");
      break;
   }
}

祝你好运!

2赞 Romain Linsolas 6/17/2010 #3

一个想法:

try {
    int i = Integer.parseInt(myString);
    if (i < 0) {
        // Error, negative input
    }
} catch (NumberFormatException e) {
    // Error, not a number.
}

commons-lang 库中,还有 CharUtils 类,它提供了检查字符是否为数字以及检查字符是否为字母的方法......isAsciiNumeric()isAsciiAlpha()

3赞 Duane 12/2/2012 #4

要检查字符串中的字母,您可以使用正则表达式,例如:

someString.matches("[A-F]");

为了检查数字和阻止程序崩溃,我有一个非常简单的类,您可以在下面找到,您可以在其中定义所需的值范围。这里

    public int readInt(String prompt, int min, int max)
    {
    Scanner scan = new Scanner(System.in);

    int number = 0;

    //Run once and loop until the input is within the specified range.
    do 
    {
        //Print users message.
        System.out.printf("\n%s > ", prompt);

        //Prevent string input crashing the program.
        while (!scan.hasNextInt()) 
        {
            System.out.printf("Input doesn't match specifications. Try again.");
            System.out.printf("\n%s > ", prompt);
            scan.next(); 
        }

        //Set the number.
        number = scan.nextInt();

        //If the number is outside range print an error message.
        if (number < min || number > max)
            System.out.printf("Input doesn't match specifications. Try again.");

    } while (number < min || number > max);

    return number;
}
9赞 dsharhon 5/24/2014 #5

这里有一种极简主义的方法可以做到这一点。

System.out.print("Please enter an integer: ");
while(!scan.hasNextInt()) scan.next();
int demoInt = scan.nextInt();
0赞 Aman Vikram Singh 4/4/2017 #6

我尝试的是,首先我接受整数输入并检查它是否为负数,如果它为负数,然后再次接受输入

Scanner s=new Scanner(System.in);

    int a=s.nextInt();
    while(a<0)
    {
    System.out.println("please provide non negative integer input ");
    a=s.nextInt();
    }
    System.out.println("the non negative integer input is "+a);

在这里,您需要先输入字符,并检查用户是否提供了字符,如果没有,则再次输入字符

    char ch = s.findInLine(".").charAt(0);
    while(!Charcter.isLetter(ch))
    {
    System.out.println("please provide a character input ");
    ch=s.findInLine(".").charAt(0);
    }
    System.out.println("the character  input is "+ch);

评论

2赞 jwenting 4/4/2017
做的不仅仅是发布一些代码。解释为什么该代码是问题的答案。尤其是在最初问题 7 年后。
0赞 Aman Vikram Singh 4/4/2017
我只想添加我的观察......如果有人来这里,他会寻找解决方案......他不会看到时机......就这样,我来到了这里......你需要理解我的代码......我尝试的是,首先我接受整数输入并检查它是否为负数,如果它为负数,则再次接受输入,仅此而已,第二部分是您需要首先获取字符输入并检查用户是否提供了字符,如果不是,则再次获取字符输入