попробуйте поймать, наконец, проблему с выполнением блока

Я знал, что когда возникает исключение, блок перехвата перехватывает это исключение после перехвата исключения, оно переходит в блок finally. когда я запускаю код вроде

 public static void main(String... args) {
    try {
        throw new ClassCastException();
    } catch (IllegalArgumentException e) {
        throw new IllegalArgumentException();
    } catch (RuntimeException e) {
        System.out.println("This catch block must executed");
    } finally {
        throw new ArithmeticException();
    }
}

вывод:
Этот блок catch должен выполняться
Исключение в потоке main java.lang.ArithmeticException в com.oop.design.demo.Main.main(Main.java:31)

ожидается вывод, я ясно выше порядок выполнения. но всякий раз, когда код изменяется, например

 public static void main(String... args) {
    try {
        throw new ClassCastException();
    } catch (IllegalArgumentException e) {
        throw new IllegalArgumentException();
    } catch (RuntimeException e) {
        throw new IOException();
    } finally {
        throw new ArithmeticException();
    }
}

вывод:
Исключение в потоке main java.lang.ArithmeticException at com.oop.design.demo.Main.main(Main.java:31)

мой вопрос в том, почему блок catch не выполняется?


person Partho    schedule 27.06.2021    source источник
comment
Блок catch выполняется, но исключение забывается/переопределяется/заменяется, когда вы создаете новое исключение в блоке finally.   -  person Andreas    schedule 27.06.2021
comment
Блок finally подобен глобальному блоку catch, который будет перехватывать любое исключение из блока try или блока catch. Вы можете проверить таблицу исключений этого файла класса с помощью этой команды javap -c <class name>   -  person Anand Kumar    schedule 27.06.2021
comment
Блок Finally подобен глобальному блоку catch, который будет перехватывать любое исключение из блока try или блока catch. — это неверно. Блок finally не перехватывает уже созданные исключения. Он не может сказать, распространяется ли в данный момент исключение, не говоря уже о том, что это такое. Он может (однако) заменить любое распространяющееся в данный момент исключение на throw другое или может заменить его другой причиной завершения; например через return.   -  person Stephen C    schedule 27.06.2021
comment
Также стоит отметить, что изменение причины исключения/завершения в блоке finally считается плохим стилем. Это плохо для читабельности.   -  person Stephen C    schedule 27.06.2021