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))
Другие вопросы по тегам