Почему сканер #nextInt внутри цикла for продолжает выдавать исключение?

#java #java.util.scanner

#java #java.util.scanner

Вопрос:

Я изучал JAVA, и у меня есть небольшие сомнения по поводу кода :

 class apple {
    public static void main(String[] args) {

        int[] num = new int[3];

        Scanner input = new Scanner(System.in);
        for (int i = 0; i < num.length; i  ) {

            try {
                num[i] = input.nextInt();
            } catch (Exception e) {
                System.out
                    .println("Invalid number..assigning default value 20");
            num[i] = 20;
            }
        }

        for (int i = 0; i < num.length; i  ) {
            System.out.println(num[i]);
        }
    }
}
  

Я написал небольшую программу для обработки исключений, если пользовательский ввод не является Int, генерирует исключение и присваивает значение по умолчанию.
Если я помещаю оператор scanner внутри цикла for , он работает нормально, но если я выношу его за пределы, присваивается то же значение, при котором было выдано исключение, т.е. я ввожу char, а не int.
Но если я ввожу все целые числа, он присваивает правильные значения в массиве.

 Scanner input = new Scanner(System.in);
  

Надеюсь, вы, ребята, поняли мой вопрос.

Ответ №1:

Scanner#nextInt не продвигается дальше ввода, если не удается проанализировать целое число, поэтому, если вы продолжаете вызывать его после сбоя, он будет продолжать пытаться снова проанализировать тот же ввод, выбрасывая InputMismatchException .

Вы можете вызвать Scanner#next , игнорируя возвращаемую строку, в своем catch блоке, чтобы пропустить недопустимый ввод:

 try {
    num[i] = input.nextInt();
} catch (Exception e) {
    System.out
            .println("Invalid number..assigning default value 20");
    num[i] = 20;
    input.next();
}
  

Комментарии:

1. Это то, что вы имеете в виду, он по-прежнему передает то же значение и выдает исключение.. try { num[i] = input.nextInt(); } catch (Exception e) { System.out.println("Wrong value. PLease try again.."); num[i] = input.nextInt(); }

Ответ №2:

         try
        {
            num[i] = input.nextInt();
        }
        catch(InputMismatchException ip)
        {
            System.out.println("Invalid number..assigning default value 20");
            num[i] = 20;
            input.next();
        }
  

Комментарии:

1. 1 но вы должны добавить некоторые пояснения к своему коду .

Ответ №3:

Лучшим кодом может быть то, что вы можете проверить, является ли следующее значение целым или нет, поэтому вам даже не нужно перехватывать исключения:

    public static void main(String[] args) {

    int[] num = new int[3];

   Scanner input = new Scanner(System.in);  

    for (int i = 0; i < num.length; i  ) 
     {
             if(input.hasNextInt())
             {
                  num[i] = input.nextInt();
             }

            else
            {
                System..out.println("non integer value.. will assign it default value 20");
                num[i]=20;
                input.next();
            }
    }

    for (int i = 0; i < num.length; i  ) {

        System.out.println(num[i]);
    }


  }