Java-сканер, добавляющий переменные условия
Я хотел бы спросить, как я точно определяю, что делает моя программа, если мой пользователь вводит символ или строку, если я хочу, чтобы он вместо этого набрал целое число? Я попытался сделать это так, как я показал здесь в кавычках, а также попытался с "равно". Второй метод не сработал, первый, кажется, ведет себя странно, если часть IF работает, но ELSE полностью игнорируется.
public static void main(String[] args){
Scanner input=new Scanner(System.in);
System.out.print("Enter first integer: ");
int number1 = input.nextInt();// prompt
if (number1 == (char)number1){
System.out.println("Ok.");
}
else{
System.out.println("You were supposed to type in an int..");
System.exit(1);
}
System.out.print("Enter second integer: ");
int number2 = input.nextInt();// prompt
int sum =(number1 + number2);
System.out.printf("Your sum is: %d%n", sum);
}
5 ответов
Я предлагаю вам использовать регулярное выражение в функции hasNext() следующим образом, чтобы иметь более точное управление, например, используйте следующий шаблон, если вы ищете числа,
sc.hasNext("[0-9]+")
Вот документация для функции hasNext (шаблон String),
public boolean hasNext (Pattern pattern)
Возвращает true, если следующий полный токен соответствует указанному шаблону. Полный токен имеет префикс и постфикс после ввода, который соответствует шаблону разделителя. Этот метод может блокировать при ожидании ввода. Сканер не продвигается дальше любого ввода.
Вот простой код для выполнения проверки,
Scanner sc=new Scanner(System.in);
int input = 0;
while(true) {
System.out.println("enter a number");
if(sc.hasNext("[0-9]+")) {
input = sc.nextInt();
break;
} else {
System.out.println("not a number, try again");
sc.next(); // just consume, but ignore as its not a number
}
}
System.out.println("Entered number is : "+input);
Я не уверен, что понимаю ваш вопрос, но вижу это следующим образом:
Пользователи всегда будут вводить последовательность символов из ввода, тогда ваша программа должна проверить, может ли эта строка быть преобразована в Int, если она не может быть преобразована, она должна запросить у пользователя, говорящего, что введенные данные не являются int. В этом случае ваш nextInt сгенерирует исключение InputMismatchException.
Вероятно, гораздо более элегантным решением является использование hasNextInt(10): public static void main(String[] args){Вход сканера = новый сканер (System.in); System.out.print("Введите первое целое число: ");
if (input.hasNextInt(10)){
System.out.println("Ok. Typed number: " + input.nextInt());
}else{
System.out.println("You were supposed to type in an int..");
System.exit(1);
}
[...]
}
Scanner.nextInt(); Сканирует следующий токен ввода как int. Программа не будет выполняться за этой линией, если ввод не int.
Так что он никогда не войдет в другую часть. Не делайте никаких проверок.
Я бы предложил всегда использовать блок try/catch для обработки некорректного ввода и показа полезного сообщения. Также не забудьте закрыть объект Scanner.
Попробуй это,
try {
int number1 = sc.nextInt();// prompt
System.out.println("Ok.");
} catch (InputMismatchException ex) {
System.out.println("You were supposed to type in an int..");
System.exit(1);
}
Вы можете использовать пользовательскую функцию, как показано ниже, и вызывать ее
public static boolean isNum(String input)
{
try
{
int d = Integer.parseInt(input);
}
catch(NumberFormatException e)
{
return false;
}
return true;
}
Затем вы можете вызвать этот метод из вашей основной функции.
if(isNum(number1))