Java: сбой программы после ввода двух неверных значений - PullRequest
1 голос
/ 24 января 2020

Я кодировал программу, которая вычисляет gcd (наибольший общий делитель) и lcm (наименьший общий множитель). Все отлично работает, кроме try {...} catch(...) {...}. Вот часть кода, которая не работает так, как я хочу:

try {
    num1 = Integer.parseInt(sc.nextLine());
}
catch(Exception e) {
    System.out.println("Your input is not an integer (number w/o decimals)! Try again.");
    System.out.print("Enter your first number: ");
    num1 = Integer.parseInt(sc.nextLine());
}

При вводе, например, букв, он говорит:

Your input is not an integer (number w/o decimals)! Try again.
Enter your first number:

Но когда я набираю буквы во второй раз происходит сбой программы:

Exception in thread "main" java.lang.NumberFormatException: For input string: "asdf"
    at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:68)
    at java.base/java.lang.Integer.parseInt(Integer.java:658)
    at java.base/java.lang.Integer.parseInt(Integer.java:776)
    at GCDLCMgetter.main(GCDLCMgetter.java:56)

Возможно, я допустил очень простую ошибку, но не могу понять ...

Спасибо

Ответы [ 4 ]

2 голосов
/ 24 января 2020

Ваш второй вызов метода parseInt не находится в блоке try catch. Вы должны использовать al oop для этого вида логики c.

1 голос
/ 24 января 2020

В вашем коде он выполняется дважды:

  1. Читает строку в try{...}
  2. Есть Exception
  3. Исключение обработано catch(Exception e){...}
  4. num1 = Integer.parseInt(sc.nextLine()); внутри catch(Exception e){...} не может быть обработано. Он не находится внутри try{}.
  5. Выполнение завершено, поскольку последнее исключение не может быть обработано любым catch.

Кажется, вы используете Сканер , Я бы порекомендовал вам использовать al oop следующим образом:

while (sc.hasNextLine()){
    try {
        System.out.print("Enter your first number: ");
        num1 = Integer.parseInt(sc.nextLine());
    }
    catch(Exception e) {
        System.out.println("Your input is not an integer (number w/o decimals)! Try again.");
    }
}

Если вы управляете целыми числами, было бы интересно использовать Scanner.nextInt ()

while (sc.hasNextInt()){
    try {
        System.out.print("Enter your first number: ");
        num1 = sc.nextInt());
    }
    catch(Exception e) {
        System.out.println("Your input is not an integer (number w/o decimals)! Try again.");
    }
}
1 голос
/ 24 января 2020

Это потому, что ваше второе приглашение находится внутри блока catch. Вместо повторного запроса внутри блока catch вы хотите заключить весь код в al oop, чтобы он снова вернулся к блоку try для запроса. Что-то вроде:

boolean repeat = true;
while(repeat){
    try{
        //Prompt for input
        repeat = false;
    }catch(Exception e) {
        //Display error message
    }
}
1 голос
/ 24 января 2020

Когда вы в первый раз даете буквы, он входит в блок catch. Отображает сообщение об ошибке. И затем выполняет строку num1 = Integer.parseInt(sc.nextLine()); Снова вы ввели буквы, но на этот раз нет блока try-catch для обработки этого. Так что выдает ошибку.

...