Вопрос-ответ

How to use Scanner to accept only valid int as input

Как использовать Scanner для приема только допустимого 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 вместо числа, программа просто завершается.


Переведено автоматически
Ответ 1

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

Вопросы по теме

Ответ 2

  1. условие num2 < num1 должно быть num2 <= num1, если num2 должно быть больше num1

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

Ответ 3

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

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

}
}
Ответ 4

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

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

java