【问题标题】:How to use Scanner to accept only valid int as input如何使用 Scanner 仅接受有效的 int 作为输入
【发布时间】:2011-02-24 03:56:15
【问题描述】:

我正在尝试让一个小程序更健壮,我需要一些帮助。

Scanner kb = new Scanner(System.in);
int num1;
int num2 = 0;

System.out.print("Enter number 1: ");
num1 = kb.nextInt();

while(num2 < num1) {
    System.out.print("Enter number 2: ");
    num2 = kb.nextInt();
}
  1. 数字 2 必须大于数字 1

  2. 另外,如果用户输入字符而不是数字,我希望程序自动检查并忽略。因为现在当用户输入例如 r 而不是数字时,程序就会退出。

【问题讨论】:

  • “kb”是什么类型的?通常,从 stdin (System.in) 读取时,您会获得每个字符的 ascii/UTF8-Code,从而使您想要的检查变得非常容易。但这似乎隐藏在“kb”引用后面的对象中。目前没有人可以提供有效的代码!
  • kb 会不会是new Scanner(System.in)
  • 静态扫描仪 kb = new Scanner(System.in);

标签: java validation java.util.scanner


【解决方案1】:

使用Scanner.hasNextInt():

如果此扫描器输入中的下一个标记可以使用nextInt() 方法解释为默认基数中的int 值,则返回true。扫描仪不会超过任何输入。

这里有一个 sn-p 来说明:

Scanner sc = new Scanner(System.in);
System.out.print("Enter number 1: ");
while (!sc.hasNextInt()) sc.next();
int num1 = sc.nextInt();
int num2;
System.out.print("Enter number 2: ");
do {
    while (!sc.hasNextInt()) sc.next();
    num2 = sc.nextInt();
} while (num2 < num1);
System.out.println(num1 + " " + num2);

您不必parseInt 或担心NumberFormatException。请注意,由于hasNextXXX 方法不会超过任何输入,因此如果您想跳过“垃圾”,您可能必须调用next(),如上所示。

相关问题

【讨论】:

  • 您可以使用其他数据类型,例如双引用类型。例如:“scanner.hasNextDouble()”
【解决方案2】:

您还可以将下一个标记作为字符串 converts this string to a char array 并测试 each character in the array is a digit

如果您不想处理异常,我认为这是正确的。

【讨论】:

    【解决方案3】:

    我看到 Character.isDigit 非常适合需要,因为输入只是一个符号。 当然,我们没有关于这个 kb 对象的任何信息,但如果它是 java.util.Scanner 实例,我还建议使用 java.io.InputStreamReader 进行命令行输入。这是一个例子:

    java.io.BufferedReader reader = new java.io.BufferedReader(new java.io.InputStreamReader(System.in));
    try {
      reader.read();
    }
    catch(Exception e) {
      e.printStackTrace();
    }
    reader.close();
    

    【讨论】:

      【解决方案4】:
      1. 如果 num2 必须大于 num1,则条件 num2
      2. 不知道 kb 对象是什么,我会读 String 然后读 trying Integer.parseInt() 如果你不知道 catch 一个例外那么它是一个数字,如果你这样做,读一个新的,可能通过将 num2 设置为 Integer.MIN_VALUE 并在您的示例中使用相同类型的逻辑。

      【讨论】:

        【解决方案5】:

        这应该可行:

        import java.util.Scanner;
        
        public class Test {
            public static void main(String... args) throws Throwable {
                Scanner kb = new Scanner(System.in);
        
                int num1;
                System.out.print("Enter number 1: ");
                while (true)
                    try {
                        num1 = Integer.parseInt(kb.nextLine());
                        break;
                    } catch (NumberFormatException nfe) {
                        System.out.print("Try again: ");
                    }
        
                int num2;
                do {
                    System.out.print("Enter number 2: ");
                    while (true)
                        try {
                            num2 = Integer.parseInt(kb.nextLine());
                            break;
                        } catch (NumberFormatException nfe) {
                            System.out.print("Try again: ");
                        }
                } while (num2 < num1);
        
            }
        }
        

        【讨论】:

          【解决方案6】:

          试试这个:

              public static void main(String[] args)
              {
                  Pattern p = Pattern.compile("^\\d+$");
                  Scanner kb = new Scanner(System.in);
                  int num1;
                  int num2 = 0;
                  String temp;
                  Matcher numberMatcher;
                  System.out.print("Enter number 1: ");
                  try
                  {
                      num1 = kb.nextInt();
                  }
          
                  catch (java.util.InputMismatchException e)
                  {
                      System.out.println("Invalid Input");
                      //
                      return;
                  }
                  while(num2<num1)
                  {
                      System.out.print("Enter number 2: ");
                      temp = kb.next();
                      numberMatcher = p.matcher(temp);
                      if (numberMatcher.matches())
                      {
                          num2 = Integer.parseInt(temp);
                      }
          
                      else
                      {
                          System.out.println("Invalid Number");
                      }
                  }
              }
          

          您也可以尝试将字符串解析为int,但通常人们会尽量避免抛出异常。

          我所做的是我定义了一个定义数字的正则表达式,\d 表示数字。 + 符号表示必须有一个或多个数字。 \d前面多出的\是因为在java中\是一个特殊字符,所以必须转义。

          【讨论】:

            猜你喜欢
            • 2020-05-11
            • 2016-07-22
            • 1970-01-01
            • 2016-08-27
            • 2016-10-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-02-25
            相关资源
            最近更新 更多