Java проверка ввода является целым или пустым, чтобы учесть значение по умолчанию - PullRequest
0 голосов
/ 27 марта 2020

В настоящее время я пытаюсь создать довольно простую c java программу, которая запрашивает у пользователей ввод данных и, если они нажимают клавишу ввода, для предоставления значения по умолчанию.

В данный момент мой код делает это is

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...");
      }

Я хотел бы изменить это, чтобы проверить, что вход (если есть) является целым числом, и если нет, l oop вернуться назад, чтобы снова запросить ввод. Я знаю, что нужно использовать комбинацию hasNextInt и nextLine, но я не могу понять это.

Любая помощь будет оценена.

Ответы [ 5 ]

1 голос
/ 27 марта 2020

Вместо того, чтобы возиться с 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();
0 голосов
/ 27 марта 2020

попробуйте это

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*"));
0 голосов
/ 27 марта 2020

Сделайте это следующим образом:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        boolean valid;
        Scanner scanner = new Scanner(System.in);
        int port;
        do {
            valid = true;
            try {
                System.out.print("Please enter a port number (default 8080): ");
                port = Integer.parseInt(scanner.nextLine());
                // ...Process the port here
            } catch (NumberFormatException e) {
                System.out.println("This is an invalid input. Please try again");
                valid = false;
            }
        } while (!valid);
    }
}

Пример прогона:

Please enter a port number (default 8080): a
This is an invalid input. Please try again
Please enter a port number (default 8080): 10.5
This is an invalid input. Please try again
Please enter a port number (default 8080): 9001

Объяснение: Если входная строка не может будет проанализирован в int, например, будет введена строка ввода, такая как abc или 12.5 et c., NumberFormatException. В результате элемент управления войдет в блок catch, где valid будет установлен на false, и, таким образом, элемент управления будет вынужден вернуться на oop.

0 голосов
/ 27 марта 2020

Вы можете просто использовать java Regex

if (port.matches("\\d+")) {
  System.out.println("it's a natural number (positive integer)");
}
0 голосов
/ 27 марта 2020

Это был бы один из вариантов. Вы просто несколько раз просите пользователя ввести значение по умолчанию, и если он выходит из строя несколько раз, вы возвращаете порт по умолчанию. Если входные данные, которые они предоставляют, не являются целыми числами, возникает исключение 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
...