Как использовать 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();
}
-
Число 2 должно быть больше, чем число 1
-
Также я хочу, чтобы программа автоматически проверяла и игнорировала, если пользователь вводит символ вместо числа. Потому что прямо сейчас, когда пользователь вводит, например, 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
- условие num2 < num1 должен быть num2 <= num1, если num2 должен быть больше num1
- Не зная, что такое объект kb, я бы прочитал
String
, а затем try
ing 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 символ \
является специальным символом, поэтому он должен быть экранирован.
Ответ 5
Я вижу, что 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();
Ответ 6
Что вы можете сделать, так это взять следующий токен как String, преобразует эту строку в массив char и проверит, что каждый символ в массиве - это цифра.
Я думаю, что это правильно, если вы не хотите иметь дело с исключениями.