Почему мой try-catch при использовании для обнаружения ошибки распечатывает ошибку и мой блок catch? - PullRequest
0 голосов
/ 01 февраля 2019

В настоящее время я изучаю блоки кода try-catch и пишу фрагмент кода, который принимает входные данные от пользователя и проверяет, является ли оно целым числом или нет.мой код

int classSize = 0;
boolean error = false;
    do {
        try{
            System.out.println("Hello! Please enter how many Students you have in your class: ");
            classSize = in.nextInt();
            error = false;
        }
        catch(InputMismatchException e){
            System.out.println("Invalid input. please make sure you enter numbers ONLY! No symbols or letters.");
            classSize = in.nextInt();
            error = true;
        }
    }while(error);

Когда я пытаюсь проверить его, вводя буквы, я получаю и сообщение об ошибке, и сообщение блока попытки.

Hello! Please enter how many Students you have in your class: 
asdfsda

Invalid input. please make sure you enter numbers ONLY! No symbols or 
letters.

Exception in thread "main" java.util.InputMismatchException
at java.base/java.util.Scanner.throwFor(Scanner.java:939)
at java.base/java.util.Scanner.next(Scanner.java:1594)
at java.base/java.util.Scanner.nextInt(Scanner.java:2258)
at java.base/java.util.Scanner.nextInt(Scanner.java:2212)
at ExcerciseOne.main(ExcerciseOne.java:65)

Почему отображается блок перехвата исообщение об ошибке?Я правильно использую блок try-catch?

Ответы [ 3 ]

0 голосов
/ 01 февраля 2019

Вызов in.nextInt() внутри блока catch считывает плохой поток, оставленный первым вызовом in.nextInt() в блоке try.

Что вы можете сделать, это удалить .nextInt() вызовов в блоке catch:

boolean hasError = true;
while (hasError) {
    try {
        System.out.println("Hello! Please enter how many Students you have in your class: ");
        classSize = in.nextInt();
        hasError = false;
    } catch (InputMismatchException e) {
        System.out.println("Invalid input. please make sure you enter numbers ONLY! No symbols or letters.");
        // variable has error remains true
    }
}

Или лучше:

Поскольку InputMismatchException является подклассом RuntimeException, тип ошибки, которая вызывает эту ошибку, может бытьотфильтровано по if заявлениям.Поскольку вам нужно только правильное целое число в качестве входных данных, вы можете проверить правильность ввода, используя регулярное выражение.

boolean hasError = true;
String integerRegex = "[\\d]+"; // it means 1-to-many digits
while (hasError) {
    System.out.println("Hello! Please enter how many Students you have in your class: ");
    String input = in.nextLine();
    if (input.matches(integerRegex)) {
        classSize = Integer.parseInt(input);
        hasError = false;
    } else {
        System.out.println("Invalid input. please make sure you enter numbers ONLY! No symbols or letters.");
        // variable hasError remains true
    }
}
0 голосов
/ 01 февраля 2019

Жандармский ответ ясен, и я добавляю правильную демонстрацию для вас:

  public static void main(String[] args) {
      int studentsCount = 0;
      boolean hasError;
      do {
        try {
          System.out.println("Hello! Please enter how many Students you have in your class: ");
          Scanner in = new Scanner(System.in);
          studentsCount = in.nextInt();
          hasError = false;
        } catch (InputMismatchException e) {
          System.out.println("--> Invalid input. please make sure you enter numbers ONLY! No symbols or letters.");
          hasError = true;
        }
      } while (hasError);
      System.out.println("There are " + studentsCount + " students in your class.");
  }
0 голосов
/ 01 февраля 2019

Вы перехватываете исключение, выданное в предложении try, но затем снова считываете со сканера внутри catch и, таким образом, выдает еще одно исключение, на этот раз необработанное.

classSize = in.nextInt();

существуетв обоих пунктах выдает исключение оба раза, но может быть пойман только тогда, когда выброшено изнутри предложения try.

...