Как использовать сканер, чтобы принимать только действительные значения int в качестве входных данных

Я пытаюсь сделать небольшую программу более надежной, и мне нужна помощь с этим.

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 вместо номера программа просто выходит.

6 ответов

Решение

Использование Scanner.hasNextInt():

Возвращаетtrue если следующий токен на входе этого сканера может быть интерпретирован какintзначение по умолчанию с использованием nextInt() метод. Сканер не продвигается дальше любого ввода.

Вот фрагмент для иллюстрации:

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()если вы хотите пропустить "мусор", как показано выше.

Смежные вопросы

  1. условие num2
  2. не зная, что такое объект kb, я бы прочитал String а потом tryИНГ Integer.parseInt() и если вы этого не сделаете catch исключение, то это число, если вы это делаете, прочитайте новое, возможно, установив для num2 значение Integer.MIN_VALUE и используя логику того же типа в вашем примере.

Это должно работать:

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);

    }
}

Попробуй это:

    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 \ это специальный символ, поэтому его нужно экранировать.

Вы можете также взять следующий токен как строку, преобразовать эту строку в массив символов и проверить, является ли каждый символ в массиве цифрой.

Я думаю, что это правильно, если вы не хотите иметь дело с исключениями.

Я вижу, что 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();
Другие вопросы по тегам