оператор try-catch не возвращается к блоку try при отлове исключения

1

У меня есть метод, который написал. Этот метод просто сканирует введенный пользователем целочисленный ввод. Если пользователь вводит значение символа, он выдает исключение несоответствия ввода, которое обрабатывается в моей инструкции Try-Catch. Проблема состоит в том, что если пользователь вводит что-либо, что не является числом, а затем генерируется исключение, мне нужен метод для обратной связи, чтобы снова запросить пользователя. Насколько я понимаю, оператор Try catch автоматически возвращается к блоку Try, если обнаружена ошибка. Это неправильно? Пожалуйста, порекомендуйте.

Вот мой метод (это довольно просто):

public static int getMask() {
        //Prompt user to enter integer mask
        Scanner keyboard = new Scanner(System.in);
        int output = 0;
        try{
            System.out.print("Enter the encryption mask: ");
            output = keyboard.nextInt();
        }
        catch(Exception e){
            System.out.println("Please enter a number, mask must be numeric");
        }
        return output;
    }//end of getMask method

Вот как метод реализован в моей программе:

//get integer mask from user input
        int mask = getMask();
        System.out.println("TEMP mask Value is: " + mask);

/***********************************/Вот мой обновленный код. Он создает цикл ввода, который я не могу избежать. Я не понимаю, почему я так много борюсь с этим. Пожалуйста помоги.

public static int getMask() {
    //Prompt user to enter integer mask
    Scanner keyboard = new Scanner(System.in);
    int output = 0;
    boolean validInput = true;

    do{
    try {
        System.out.print("Enter the encryption mask: ");
        output = keyboard.nextInt();
        validInput = true;
    }
    catch(InputMismatchException e){
        System.out.println("Please enter a number, mask must be numeric");
        validInput = false;
        }
    }while(!(validInput));

    return output;

/********************/FINAL_ANSWER Я смог получить его наконец. Я думаю, мне просто нужно больше изучать логическую логику. Иногда это заставляет мою голову вращаться. Реализация цикла с целым тестом отлично работала. Моя собственная ошибка пользователя. Вот мой последний код, который работает корректно с лучшей обработкой исключений. Дайте мне знать в комментариях, если у вас есть какие-либо критические замечания.

//get integer mask from user input
        int repeat = 1;
        int mask = 0;
        do{
            try{

        mask = getMask();
        repeat = 1;
            }
            catch(InputMismatchException e){
                repeat = 0;
            }
        }while(repeat==0);
Теги:
try-catch

3 ответа

2
Лучший ответ

Насколько я понимаю, оператор Try catch автоматически возвращается к блоку Try, если обнаружена ошибка. Это неправильно?

Это действительно неверно. Блок try будет выполняться только один раз.

Вы можете использовать это, чтобы "обойти" его (хотя ответ JasonC более прочный - идите с этим):

boolean validInput = false;

while (!validInput) {
    try {
        System.out.print("Enter the encryption mask: ");
        output = keyboard.nextInt();
        validInput = true;
    }
    catch(Exception e) {
        keyboard.nextLine(); // swallow token!
        System.out.println("Please enter a number, mask must be numeric");
    }
}
return output;

Дальнейшее примечание: вы НЕ должны ловить Exception но более конкретный класс исключений.

  • 0
    Спасибо за ответ с кодом, я действительно ценю это. Сказать, что я делаю неправильно, никогда не поможет, если я не смогу увидеть правильный ответ для сравнения. Я приму ваш ответ, когда позволят.
  • 0
    О, одна проблема, которую я тоже пропустил; nextInt() оставит токен в потоке при сбое.
Показать ещё 6 комментариев
3

Насколько я понимаю, оператор Try catch автоматически возвращается к блоку Try, если обнаружена ошибка. Это неправильно?

Нет, это неправильно, и мне любопытно, как вы пришли к такому пониманию.

У вас есть несколько вариантов. Например (это не будет работать как есть, но сначала поговорим об обработке ошибок, а затем прочитайте ниже):

// Code for illustrative purposes but see comments on nextInt() below; this
// is not a working example as-is.
int output = 0;
while (true) {
    try{
        System.out.print("Enter the encryption mask: ");
        output = keyboard.nextInt();
        break;
    }
    catch(Exception e){
        System.out.println("Please enter a number, mask must be numeric");
    }
}

Среди прочих; ваш выбор варианта обычно зависит от ваших предпочтительных вкусов (например, fge-ответ - это та же идея, но немного отличается), но в большинстве случаев это прямое отражение того, что вы пытаетесь сделать: "Продолжайте спрашивать, пока пользователь вводит действительный номер. "

Обратите внимание, что, как и в случае с fge, вы должны, как правило, следить за самым строгим исключением, которое вы готовы обработать. nextInt() выбрасывает несколько разных исключений, но ваш интерес определен специально в InputMismatchException. Вы не готовы обрабатывать, например, IllegalStateException - не говоря уже о том, что это затруднит отладку/тестирование, если будут IllegalStateException неожиданные исключения, но ваша программа делает вид, что они просто связаны с недопустимым вводом (и поэтому никогда не уведомляет вас о том, что другая проблема произошло).

Теперь, Scanner.nextInt(), Scanner.nextInt() имеет другую проблему здесь, где токен остается в потоке, если он не может быть проанализирован как целое. Это оставит вас застрявшим в цикле, если вы не возьмете этот токен из потока. Для этого вы действительно хотите использовать либо next() либо nextLine(), чтобы токен всегда потреблялся независимо от того, что; то вы можете анализировать с помощью Integer.parseInt(), например:

int output = 0;
while (true) {
    try{
        System.out.print("Enter the encryption mask: ");
        String response = keyboard.next(); // or nextLine(), depending on requirements
        output = Integer.parseInt(response);
        break;
    }
    catch(NumberFormatException e){ // <- note specific exception type
        System.out.println("Please enter a number, mask must be numeric");
    }
}

Обратите внимание, что это по-прежнему прямо отражает то, что вы хотите сделать: "Продолжайте спрашивать, пока пользователь вводит действительный номер, но потребляйте входные данные независимо от того, что они вводят".

  • 1
    Эх, у нас одно и то же решение, только вы используете break, а я использую boolean ...
1

Как указано в комментариях, try-catch -blocks не работает. Используйте for или while если хотите цикл.

  • 0
    Вы получили это, спасибо за ответ. +1
  • 1
    Это хороший ответ на первый вопрос, но было бы более полезным, если бы он представлял рабочую альтернативу.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню