Try — catch не может перехватить исключение, потому что, когда исключение произошло, введите рекурсию в catch, блок try не работает и просто попадает в блок catch

пакет object.myobject;

импортировать java.util.Scanner;

общественный класс CatchTheException { Сканер-сканер = новый сканер(System.in);

void receiveInt(){
    System.out.println("please input an int");
    try{
        System.out.println(scanner.nextInt());
        System.out.println("try block wont work");
    }catch (Exception e){
        System.out.println(e);
        System.out.println("the input is wrong, please input again");
        receiveInt();
    }
}

public static void main(String[] args) {
    new CatchTheException().receiveInt();

}

}

Я не знаю, почему блок try не работает, возможно, исключение не перехвачено? Я новичок в try catch. я запускаю и пытаюсь, блок не работает, рекурсия не останавливается, поэтому я получаю исключение stackoverflow

Вам необходимо очистить символ следующей строки перед повторным вызовом метода getInt().

BIBOO unit 14.08.2024 05:44

Привет, usuario25443671, я не понимаю, почему вы говорите, что ваш код не работает, если я введу «p», он напечатает java.util.InputMismatchException, ввод неверен, введите int, и если я введу «3», он печать, попытка блока не работает, что вы ожидаете от него на печать?

Marce Puente 14.08.2024 07:08

Вопрос в том, что когда я печатаю «p», код в методе получения Int() вызывается снова и снова, но код в блоке try не запускается, что приводит к исключению StackOverFlowException.

CodeNewbie 14.08.2024 07:22

Что мне следует сделать, чтобы подробно очистить символ следующей строки?

CodeNewbie 14.08.2024 07:31

какой заголовок.... если вы видите сообщение "the input is wrong, please input again", то выполняется блок catch -- если вы не видите "try block wont work", то опять же выполняется блок catch, так как nextInt() не возвращается нормально -- то есть попробуйте -catch перехватывает исключение

user85421 14.08.2024 08:17

Re: «по какой причине блок try не работает»: nextInt() выдает исключение, поскольку ввод недействителен int (например, некоторые буквы); System.out.println(scanner.nextInt()); завершается этим исключением без вызова println(); блок catch выполняется, печатает "the input is wrong, please input again" и снова вызывает receiveInt(); поскольку предыдущий nextInt() не использовал входные данные, то же самое происходит снова: nextInt() снова выдает исключение, println(scanner.nextInt()) завершается без печати, выполняется блок catch, ...

user85421 14.08.2024 08:25

ок, спасибо за комментарий, теперь я знаю, что проблема в исключении сканера

CodeNewbie 14.08.2024 09:02
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
7
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вам нужно убрать receiveInt(); в исключении.

Пример:

while (true) {
    try {
        System.out.println("Please input an int");
        scanner.nextInt();
        break;
    } catch (InputMismatchException e) {
        System.out.println("That isn't an integer");
        scanner.next();
    }
}

Большое спасибо, это правильный ответ, чтобы избежать такой ситуации, но если вы знаете, по какой причине блок try не работает, сообщите мне.

CodeNewbie 14.08.2024 07:28

@CodeNewbie — это потому, что вызов receiveInt() в блоке исключений вашего кода создаст бесконечную рекурсию, которая быстро приведет к ошибке StackOverflowError.

DevilsHnd - 退した 14.08.2024 10:57

@CodeNewbie проблема в том, что вы нажимаете клавишу «ввод». Его также рассматривают как персонажа. Это вызывает проблему.

Zahid Khan 14.08.2024 11:45

Вот альтернативный способ сделать это:

Scanner scanner = new Scanner(System.in);
String num = "";
while (num.isEmpty()) {
    System.out.print("Please enter an integer value: -> ");
    num = scanner.nextLine().trim();
    /* Is the supplied value a string representation of a
       signed or unsigned integer value?     */
    if (!num.matches("-?\\d+")) {
        System.out.println("Invalid Entry (" + num + ")! Try again...\n");
        num = ""; // Ensure re-loop
    }
}
        
// Passed entry validation:
int number = Integer.parseInt(num);  // Convert string value to Integer type:
System.out.println("Your Number: -> " + number);

Другие вопросы по теме