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

Почему код обработки исключений Java создает «132Exception в основном потоке MyExc1» вместо «13Exception в основном потоке MyExc2»?

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

Why does the Java exception handling code produce \

Обработка исключений в Java: раскрытие неоднозначности

В загадочном сценарии обработки исключений Java университетский вопрос представил следующий фрагмент кода:

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

// Main Class
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 in thread main MyExc2». Однако правильный ответ — «132Exception in thread main MyExc1».

Разъяснение неоднозначности

Чтобы разгадать эту загадку, важно понять приоритет исключений:

  • Принцип: Когда новое исключение генерируется в блоке catch или Final, текущее обрабатываемое исключение прерывается.
  • Последствия :

    • Распространение текущего исключения остановлено.
    • Новое исключение становится распространяющимся.
    • Новое исключение разворачивает стек как обычно, обнаружение любых применимых блоков catch илиfinally.

Повторное отслеживание выполнения

Применение этого принципа к коду:

  1. Первоначальное выполнение:

    • Строка 13: MyExc1 выбрасывается в блоке try функции q().
    • Строка 18: MyExc1 перехватывается в блоке catch функции q().
    • Строка 21: выполняется строка 21 (печатает 3).
  2. Catch Block Исключение:

    • Строка 19: MyExc2 выбрасывается в блок catch функции main().
    • Строка 22: MyExc2 прерывает распространение MyExc1.
    • Строка 19: MyExc2 начинает раскручивать стек.
  3. Выполнение возобновляется в основном блоке Try:

    • Строка 15 : Строка 15 выполняется (печатает 2).
    • Строка 16: MyExc1 выбрасывается в блокfinally функции main().
    • Строка 16: MyExc1 прерывает распространение MyExc2.
    • Строка 16: MyExc1 начинает разворачивать стек (и все еще подвергается блокировке main в методеfinally).
  4. Finally Block Exception:

    • Строка 23: Исключение генерируется в блоке Final функции main().
    • Строка 23: Исключение прерывает распространение MyExc1.
    • Строка 23: Исключение начинает раскручиваться вверх по стеку.

Вывод:

Окончательный вывод — «132Exception in thread main MyExc1», потому что исключение, которое распространяется наружу Основным методом является MyExc1, выброшенный в строке 16. MyExc2, выброшенный в строке 19, прерывается, когда MyExc1 выбрасывается в строке 16.

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

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

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

Copyright© 2022 湘ICP备2022001581号-3