Как использовать сканер, чтобы принимать только действительные значения 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
вместо номера программа просто выходит.
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()
если вы хотите пропустить "мусор", как показано выше.
Смежные вопросы
- условие num2
- не зная, что такое объект kb, я бы прочитал
String
а потомtry
ИНГInteger.parseInt()
и если вы этого не сделаетеcatch
исключение, то это число, если вы это делаете, прочитайте новое, возможно, установив для num2 значение Integer.MIN_VALUE и используя логику того же типа в вашем примере. - не зная, что такое объект kb, я бы прочитал
Это должно работать:
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();