Как использовать Сканер для принятия только допустимого интервала, как введено

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

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

24
задан Ivar 19 July 2018 в 10:45
поделиться

6 ответов

Используйте Scanner.hasNextInt () :

Возвращает истину , если следующий токен на входе этого сканера можно интерпретировать как значение 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 () , если вы хотите пропустить «мусор», как показано выше.

Связанные вопросы

33
ответ дан 28 November 2019 в 23:34
поделиться

Попробуйте следующее:

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

2
ответ дан 28 November 2019 в 23:34
поделиться

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

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

0
ответ дан 28 November 2019 в 23:34
поделиться

Я вижу, что 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();
0
ответ дан 28 November 2019 в 23:34
поделиться

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

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

    }
}
3
ответ дан 28 November 2019 в 23:34
поделиться
  1. условие num2
  2. , не зная, что такое объект kb, я бы прочитал String , а затем попробуйте ing Integer.parseInt () , и если вы не поймаете исключение, тогда это число, если вы это сделаете, прочтите новый один, возможно, установив num2 в Integer.MIN_VALUE и используя тот же тип логики в вашем примере.
4
ответ дан 28 November 2019 в 23:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: