【问题标题】:Java check input is integer or empty to allow for default valueJava 检查输入为整数或空以允许默认值
【发布时间】:2020-03-27 13:09:21
【问题描述】:

我目前正在尝试制作一个相当基本的 Java 程序,该程序会询问用户输入以及他们是否按 Enter 以提供默认值。

目前我的代码是

System.out.println("Please enter a port number (default 8080): ")
port = scanner.nextLine();
      if (port.isEmpty() || port.equals("8080")) {
          port = "8080";
          System.out.println("Using default port...");
      }
      else {
          System.out.println("Using new port...");
      }

我想更改它以检查输入(如果有)是否为整数,如果不是,则循环返回以再次请求输入。我知道它需要结合使用 hasNextInt 和 nextLine 但我无法弄清楚。

任何帮助将不胜感激。

【问题讨论】:

    标签: java java.util.scanner


    【解决方案1】:

    我建议不要乱用 nextInt(),而是尝试将输入解析为整数并在失败时处理异常

    Scanner scanner = new Scanner(System.in);
    System.out.println("Please enter a port number (default 8080): ");
    String port = null;
    while (true) {
        port = scanner.nextLine();
        if (port.isEmpty() || port.equals("8080")) {
            port = "8080";
            break;
        } else {
            try {
                Integer.valueOf(port);
                break;
            } catch (NumberFormatException ex) {
                System.out.println("Incorrect value given, try again");
            }
        }
    }
    System.out.println("You have selected " + port);
    scanner.close();
    

    【讨论】:

    • 这非常适合我正在尝试做的事情,非常感谢!
    • 您不必检查额外的port.equals("8080") 条件。
    • @ZainArshad 是的,我只是保持那部分不变
    【解决方案2】:

    你可以简单地使用 java 正则表达式

    if (port.matches("\\d+")) {
      System.out.println("it's a natural number (positive integer)");
    }
    

    【讨论】:

      【解决方案3】:

      这是一种选择。您只需要求用户几次输入默认值,如果他们多次失败,则返回默认端口。如果他们提供的输入不是整数,则会抛出 InputMismatchException 并且我们告诉他们它不正确,那么我们要么再次尝试,要么返回默认值。

      值得注意的是,我们调用 Scanner#next() 来清除底层缓存以删除任何现有数据。

          public static void main(String[] args) {
              Scanner scanner = new Scanner(System.in);
      
              int port = askForPortOr(scanner, 8080, 0, 3);
      
              System.out.println("port: " + port);
          }
      
          private static int askForPortOr(Scanner scanner, int defaultPort, int attempts, int maximumAttempts) {
              try {
                  System.out.println("Please enter a port number (default 8080): ");
                  return scanner.nextInt();
              } catch (InputMismatchException ime) {
                  scanner.next();
      
                  if (++attempts < maximumAttempts) {
                      System.out.println("Incorrect port, please try again...");
                      return askForPortOr(scanner, defaultPort, attempts, maximumAttempts);
                  }
                  return defaultPort;
              }
          }
      

      输出

      Please enter a port number (default 8080): 
      808o
      Incorrect port, please try again...
      Please enter a port number (default 8080): 
      808o
      Incorrect port, please try again...
      Please enter a port number (default 8080): 
      808o
      port: 8080
      

      【讨论】:

        【解决方案4】:

        试试这个

        String port;
             Scanner scanner = new Scanner(System.in);
             do {
             System.out.println("Please enter a port number (default 8080): ");
             port = scanner.nextLine();
                   if (port.isEmpty() || port.equals("8080")) {
                       port = "8080";
                       System.out.println("Using default port...");
                   }     
         }while(!port.matches("\\d*"));
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-06-30
          • 2013-11-16
          • 2013-07-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-02-12
          相关资源
          最近更新 更多