Блоки Try/Catch и следующие операторы

У меня есть некоторые проблемы с моим кодом ниже. В этой программе я ввожу описание, единицы и цену предмета. Я сделал два пользовательских класса исключений для возможности ввода пользователем отрицательного числа. Когда я запускаю программу, операторы catch работают, но мне кажется странным, что операторы после блока catch также выполняются. Поправьте меня, если я ошибаюсь, но разве программа не должна выполнять операторы после оператора catch, если есть исключение? У меня сложилось впечатление, что единственный способ сделать это — использовать блок finally. Любая помощь будет принята с благодарностью!

  import java.util.Scanner;

public class RetailItemDemo
{
    public static void main (String[] args)
    {
        Scanner keyboard = new Scanner(System.in);
        RetailItem item = new RetailItem();

    System.out.print("Item description: ");
    item.setDescription(keyboard.nextLine());

    try 
    {
        System.out.print("Units on hand: ");
        item.setUnitsOnHand(keyboard.nextInt());

        System.out.print("Item price: ");
        item.setPrice(keyboard.nextDouble());
    }

    catch (NegativeUnitsException nue)
    {
        System.out.println(nue);
    }

    catch (NegativePriceException npe)
    {
        System.out.println(npe);
    }

    System.out.println("\nThe item is a  " + item.getDescription());
    System.out.println("There are " + item.getUnitsOnHand() + " units on hand");
    System.out.println("The item price is " + item.getPrice() + "\n");
 }
}

person Saad    schedule 24.04.2014    source источник
comment
Если возникает исключение, оно обрабатывается.   -  person Sotirios Delimanolis    schedule 25.04.2014
comment
Вот учебник Java по обработке исключений.   -  person Sotirios Delimanolis    schedule 25.04.2014
comment
Это было действительно полезно, спасибо!   -  person Saad    schedule 25.04.2014
comment
Спасибо всем, кто ответил!   -  person Saad    schedule 25.04.2014


Ответы (4)


Поправьте меня, если я ошибаюсь, но разве программа не должна выполнять операторы после оператора catch, если есть исключение? У меня сложилось впечатление, что единственный способ сделать это — использовать блок finally.

Боюсь, вы ошибаетесь. Смысл try-catch в том, что мы выполняем некоторый код в try, который может дать сбой. Если возникает исключение, мы обрабатываем сбой в блоке catch, затем продолжаем как обычно (вместо того, чтобы распространять исключение на более высокий уровень, возможно, выходя из всей программы), выполняя любой дальнейший код после блока catch.

Код в блоке finally выполняется независимо от того, выброшено ли исключение. Это используется для закрытия ресурсов (таких как открытые файлы), которые необходимо очистить, что бы ни случилось.

Если вы хотите пропустить все после создания исключения, то нет смысла обрабатывать исключение с помощью try-catch. Вам лучше обрабатывать исключение на более высоком уровне (хотя в вашем примере вы уже находитесь на верхнем уровне, т.е. main).

person DNA    schedule 24.04.2014
comment
Обратите внимание, что финализаторы не требуются для запуска и не требуются для немедленного запуска. Это делает их потенциально опасными в использовании. Источник: Роберт Блох, Эффективная Java, 2-е издание. - person Anubian Noob; 25.04.2014
comment
@AnubianNoob Здесь ничего нет о финализаторах. - person David Conrad; 25.04.2014
comment
Блоки @AnubianNoob finally полностью отличаются от финализаторов. - person David Conrad; 25.04.2014

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

Чтобы предотвратить это, добавьте System.exit(0); в блок catch.

Если у вас также есть блок finally, он будет выполнен, даже если вы закроете программу в блоке catch.

person Harry Blargle    schedule 24.04.2014

Java использует модель завершения обработки исключений, которая в основном ведет себя так, как вы ее испытали:

дальнейшая обработка в этом методе прекращается, и управление передается ближайшему обработчику исключений, который может обрабатывать тип исключения, обнаруженный здесь: http://www.informit.com/articles/article.aspx?p=464630&seqNum=4.

Когда обработчик исключений (блок перехвата) завершает обработку непрерывного выполнения в первой строке кода после блока try/catch.

В модели возобновления обработки исключений после обработки исключения поток возвращается в то место, где возникло исключение, и программа продолжает работу с этого места.

person zlinks    schedule 24.04.2014

Используйте System.exit(0); в блоке catch.

person JoshYates1980    schedule 24.04.2014