«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Почему в этом примере обработки исключений Java исчезает исключение MyExc2?

Почему в этом примере обработки исключений Java исчезает исключение MyExc2?

Опубликовано 4 ноября 2024 г.
Просматривать:723

Why Does the `MyExc2` Exception Disappear in This Java Exception Handling Example?

Обработка исключений в предложениях Catch и Final

При работе с обработкой исключений в Java крайне важно понимать взаимодействие между предложениями catch и Final . Рассмотрим следующий пример, приведенный для университетского задания:

class MyExc1 extends Exception {}
class MyExc2 extends Exception {}
class MyExc3 extends MyExc2 {}

public class C1 {
    public static void main(String[] args) throws Exception {
        try {
            System.out.print(1);
            q();
        }
        catch (Exception i) {
            throw new MyExc2();
        }
        finally {
            System.out.print(2);
            throw new MyExc1();
        }
    }

    static void q() throws Exception {
        try {
            throw new MyExc1();
        }
        catch (Exception y) {
        }
        finally {
            System.out.print(3);
            throw new Exception();
        }
    }
}

Вопрос задается для вывода этого кода. Хотя некоторые, возможно, ответили: «13Exception в главном потоке MyExc2», правильный ответ — «132Exception в главном потоке MyExc1».

Почему MyExc2 исчезает

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

  • Исключение в блоке catch: Если в блоке catch выдается новое исключение (как видно из throw new MyExc2() выше), исходное исключение «прервано». Текущий путь выполнения остается незавершенным, и новое исключение становится тем, которое распространяется наружу.
  • Исключение в блоке Final: Аналогично, если в блокfinally, исходное исключение также прерывается. Однако есть важный момент, на который следует обратить внимание:

    • Блокfinally блока Catch: Если новое исключение генерируется в блокеfinally блока catch, оно все равно будет подвержено этому блоку catch. наконец заблокировать, если таковые имеются.

Отслеживание исключений

Отслеживая выполнение на основе этих принципов, мы видим, что:

  1. Блок try в main печатает «1» и вызывает q().
  2. Внутри q() блок try выдает MyExc1.
  3. Блок catch в q() обрабатывает исключение молча.
  4. Блокfinally в q() печатает «3» и выдает исключение.
  5. Блок Catch в main:

    • MyExc2 выбрасывается в этот блок, прерывая исходный MyExc1.
    • Однако в блоке catch есть блокfinally, который все еще выполняется.
  6. Наконец блок в основном:

    • MyExc1 выбрасывается в этот блок, прерывая MyExc2.

Поэтому правильный вывод — «132Exception в главном потоке MyExc1». Исключение MyExc2 «забыто», поскольку новое исключение (MyExc1) создается в блокеfinally блока catch, который обрабатывал MyExc2.

Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3