【问题标题】:How to implement int validation, so the input can only be an int and between a min and max?如何实现 int 验证,所以输入只能是 int 并且介于 min 和 max 之间?
【发布时间】:2014-05-02 16:35:56
【问题描述】:

我想知道如何验证此代码以使输入只能是 int 并且介于 min 和 max 之间?到目前为止,我只能阻止输入小于 1 并且使用任何最大值。但我似乎无法创建一个场景,如果用户输入的不是最大值和最小值之间的任何内容(例如“AAA”),它就会循环。我不断收到输入不匹配错误。任何帮助将不胜感激!

private static int getUserOption(String prompt, int max) { 
    int h;
    do {
        Scanner sc = new Scanner(System.in);
        System.out.print(prompt);
        h=sc.nextInt();
        if(!sc.hasNextInt()) {
                System.out.println("Invalid option. Try again!:");
        }
    } while(h<1 || h>max);
    return h;    
}

【问题讨论】:

  • 你能提供意见吗???

标签: java validation while-loop do-while


【解决方案1】:

循环正在中断,因为 nextInt() 方法正在抛出异常,这会提前终止该方法。

一种选择是使用 try / catch 块来捕获异常:

private static int getUserOption(String prompt, int max) { 
    int h = 0;
    do {
        Scanner sc = new Scanner(System.in);
        System.out.print(prompt);
        try {
            h=sc.nextInt();
        } catch (InputMismatchException e) {
            System.out.println("Invalid option. Try again!:");
        }
    }while(h<1 || h>max);
    return h;
}

【讨论】:

  • 谢谢,所以这只能通过 try/catch 实现?我以前从未使用过它,并希望在继续之前精通 do/while、for 和 if/else。如果是这样,非常感谢您的帮助!
  • sc.nextInt() 方法需要一个整数,所以如果你输入一个字符串总是会抛出一个异常。您的另一个选择是调用sc.next(),它将以字符串的形式返回任何输入;然后,您可以检查是否可以将其转换为整数,如果不能,则打印错误消息。可以说更复杂:)
【解决方案2】:

你可以试试这个代码!

Scanner sc = new Scanner(System.in);
int number;
do {
System.out.println("Please enter a valid number: ");
while (!sc.hasNextInt()) {
   System.out.println("Error. Please enter a valid number: ");
   sc.next(); 
}
number = sc.nextInt();
} while (!checkChoice(number));

private static boolean checkChoice(int choice){
if (choice <MIN || choice > MAX) {     //Where MIN = 0 and MAX = 20
    System.out.print("Error. ");
    return false;
 }
 return true;
 }

参考。 Validating input with while loop and scanner

【讨论】:

    【解决方案3】:

    几点:

    1.要检查输入是否小于最小值,只需在方法签名中添加int min

    2.检查输入是否为int,捕获InputMismatchException

    修改后的代码是:

    private static int getUserOption(String prompt, int max, int min) { 
        int h;
        do {
            Scanner sc = new Scanner(System.in);
            System.out.print(prompt);
            try {
                h=sc.nextInt();
            } catch (InputMismatchException e) {
                System.out.println("Invalid option. Try again!:");
            }
        } while(h<min || h>max);
        return h;    
    }
    

    【讨论】:

      【解决方案4】:

      我不明白您是想在用户输入有效答案之前一直询问还是只询问一次。 while 块建议继续询问直到是有效输入。 这是您要求的小sn-p。我建议你读一些书,SO 有很多建议。

      public static class InvalidUserException extends Exception {
      
          public InvalidUserException(String message) {
              super(message);
          }
      
          public InvalidUserException(String message, Throwable cause) {
              super(message, cause);
          }
      
      }
      
      private static int getIntFromScanner(int max) throws InvalidUserException {
          int nextInt = 0;
      
          Scanner sc = new Scanner(System.in);
          try {
              nextInt = sc.nextInt();
      
          } catch (InputMismatchException e) {
              throw new InvalidUserException("Input must be a valid Integer", e);
          }
      
          if (nextInt > max) {
              throw new InvalidUserException(
                      "Input is bigger than allowed! Max: " + max + " Input: "
                              + nextInt);
          }
          return nextInt;
      }
      
      public static int getUserOption(String prompt, int max) {
          System.out.println(prompt);
          do {
              try {
                  return getIntFromScanner(max);
              } catch (InvalidUserException e) {
                  System.out.println("Invalid option. Try again ("
                          + e.getMessage() + ")");
              }
          } while (true);
      }
      
      public static void main(String[] args) {
          int userOption = getUserOption("Gimme less than or equal 6!", 6);
          System.out.println("You gave me " + userOption);
      }
      

      【讨论】:

        猜你喜欢
        • 2010-09-13
        • 2012-02-07
        • 2014-12-09
        • 1970-01-01
        • 2011-08-11
        • 2021-01-13
        • 1970-01-01
        • 2014-09-14
        • 1970-01-01
        相关资源
        最近更新 更多