Программа по-прежнему выдает исключение InputMismatchException и завершает работу, даже если оно было перехвачено

#java #exception #inputmismatchexception

#java #исключение #исключение inputmismatchexception

Вопрос:

Я только изучаю Java и борюсь с обработкой исключений. Я пытаюсь написать быструю программу, которая принимает некоторые входные данные и экспортирует их, преобразованные в разные единицы.

Я использую сканер для приема входных данных и пытаюсь защититься от исключения InputMisatchException, но, несмотря на то, что вокруг него установлен блок try-catch для обработки исключения, он все равно завершается. код приведен ниже. Надеюсь, вы сможете помочь! Заранее спасибо.

 import java.util.InputMismatchException;

import java.util.Scanner;

class Main {
  public static void main(String[] args) {
    
    //init variables
    String name = "";
    int age = -1;
    int height_in_cm = -1;

    //Init Scanner
    Scanner input = new Scanner(System.in);

    //Get the input from the user and save to the initiated variables above.
    System.out.print("Please enter your name: ");
    name = input.nextLine();
    try{
    System.out.printf("Hey, %s. How old are you?: ", name);
    age = input.nextInt();
    } catch (InputMismatchException e){
        System.out.printf("Agh! Sorry %s. We were expecting a number made up of digits between 0-9. Try again for us? n How old are you?: ", name);
        age = input.nextInt();
    }
    System.out.print("And finally, what is your height in CM?: ");
    height_in_cm = input.nextInt();

    //close the scanner to protect from resource leaks.
    input.close();


  }
}```
  

Ответ №1:

Причина исключения заключается в том, что при первом возникновении исключения сканер (ввод) не обновляет свой указатель, поэтому input.nextInt() в блоке catch считывается тот же ввод, что и в input.nextInt() блоке try .

Чтобы решить эту проблему, добавьте input.nextLine() блок catch перед чтением значения int.

  try{
        System.out.printf("Hey, %s. How old are you?: ", name);
        age = input.nextInt();
    } catch (InputMismatchException e){
        System.out.printf("Agh! Sorry %s. We were expecting a number made up of digits between 0-9. Try again for us? n How old are you?: ", name);
        input.nextLine();
        age = input.nextInt();
    }
  

Ответ №2:

Вам нужна дополнительная попытка -поймать

 height_in_cm = input.nextInt();
  

Иначе вы получите другое исключение!

Ответ №3:

Причина в том, что вы улавливаете ошибку в блоке catch. Попробуйте реализовать для него цикл. Также не забудьте очистить буфер с помощью input.next(); , иначе вы столкнетесь с бесконечным циклом

 do
{
    try
    {
        System.out.printf("Hey, %s. How old are you?: ", name);
        age = input.nextInt();
        stop = true;
    } 
    catch (InputMismatchException e)
    {
        System.out.printf("Agh! Sorry %s. We were expecting a number made up of digits between 0-9. Try again for us? n How old are you?: ", name);
        input.next(); // Clearing the buffer. This is important otherwise Infinite Loop will occur
    }
} while( !stop );