有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用java验证输入。util。扫描仪

我使用java.util.ScannerSystem.in获取用户输入。我需要验证输入,例如:

  • 它必须是一个非负数
  • 它一定是按字母顺序排列的
  • 。。。等

最好的方法是什么


共 (6) 个答案

  1. # 1 楼答案

    一个想法:

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

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

  2. # 2 楼答案

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

    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);
    
  3. # 3 楼答案

    如果您正在从控制台或类似工具解析字符串数据,最好的方法是使用正则表达式。请在此处阅读更多相关信息: 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;
       }
    }
    

    祝你好运

  4. # 4 楼答案

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

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

    为了检查数字和停止程序崩溃,我有一个非常简单的类,你可以在下面找到,在这里你可以定义你想要的值的范围。 Here

        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;
    }
    
  5. # 5 楼答案

    这里有一个最简单的方法

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

    Scanner.hasNextXXX方法概述

    ^{}有许多hasNextXXX方法可用于验证输入。以下是所有这些项目的简要概述:

    • ^{}-它有任何标记吗
    • ^{}-它是否有另一行输入
    • 对于Java原语
      • ^{}-它是否有可以解析为int的标记
      • 还有^{}^{}^{}^{}^{}^{}
      • 作为奖励,还有^{}^{}
      • 整数类型还具有指定基数的重载(例如十六进制)
    • 基于正则表达式的

    Scanner能够实现更多功能,这是因为它基于正则表达式。一个重要的特性是^{},它允许您定义模式分隔令牌的内容。还有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);
    

    下面是一个示例会话:

    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{a17}/^{}组合更容易使用。根据合同,aScanner保证如果它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{},那么它也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

    在正则表达式中,作为Java字符串文本,模式"[aeiou]"被称为“字符类”;它匹配任何字母aeiou。注意,使上面的测试不区分大小写很简单:只需向Scanner提供这样的正则表达式模式即可

    API链接

    • ^{}-如果下一个标记与从指定字符串构造的模式匹配,则返回true
    • ^{}

    相关问题

    参考文献


    示例4:同时使用两个Scanner

    有时您需要逐行扫描,一行上有多个令牌。实现这一点的最简单方法是使用两个twoScanner,其中第二个Scanner将第一个Scanner中的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);
    }
    

    下面是一个例子sessionon:

    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提供了一组丰富的功能,例如hasNextXXX验证方法
    • 适当地组合使用hasNextXXX/nextXXX意味着Scanner永远不会抛出InputMismatchException/NoSuchElementException
    • 始终记住hasNextXXX不会使Scanner超过任何输入
    • 如果需要,不要羞于创建多个Scanner。两个简单的Scanner通常比一个过于复杂的Scanner要好
    • 最后,即使您没有任何使用高级正则表达式功能的计划,也要记住哪些方法是基于正则表达式的,哪些不是。任何采用Scanner参数的String pattern方法都是基于正则表达式的。
      • 技巧:将任何String转换为文字模式的简单方法是^{}