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



Я изучаю 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 throw исключение и присвоить значение по умолчанию.
Если я помещаю оператор scanner внутрь цикла for, он работает нормально, но если я выношу его за пределы, то присваиваю ему то же самое значение, при котором было вызвано исключение, т. е. я ввожу char, а не int.
Но если я ввожу все целые числа, он присваивает правильные значения в массиве.



Scanner input = new Scanner(System.in);


Я надеюсь, что у ребят есть понял мой вопрос.

723   3  

3 ответов:

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();
}
        try
        {
            num[i] = input.nextInt();
        }
        catch(InputMismatchException ip)
        {
            System.out.println("Invalid number..assigning default value 20");
            num[i] = 20;
            input.next();
        }

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

   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]);
    }


  }

Comments

    Ничего не найдено.