Реальная среда выполнения, наконец, серии исключений Java

Java
Реальная среда выполнения, наконец, серии исключений Java

Исключение — очень важная концепция в ядре Java, но ее легко игнорировать.В этой серии мы подробно поговорим об этой теме. Я полагаю, что после изучения этой серии вы будете хорошо осведомлены об аномальной системе и различных сценариях использования аномальной, и станете необходимым навыком для своего профессионального роста.

имя условие
Реальное время выполнения наконец завершенный
оператор попытки с ресурсами завершенный
Система исключений Java Создание...
параметр исключения в catch Создание...
Цепочка исключений Java Создание...
Обработка исключений в SpringMVC Создание...
Настроить цепочку обработки исключений SpringMVC Создание...

в предыдущемСахар синтаксиса Java: используйте оператор try-with-resources для безопасного освобождения ресурсовВ этой статье мы показали, как заменить уродливые блоки finally операторами try-with-resources.

Однако инструкция try-with-resources подходит только для автоматического закрытия ресурсов. В некоторых сценариях нам нужно выполнить другую часть кода независимо от того, возникает ли в части кода исключение. В это время нам нужно использовать оператор наконец заблокировать.

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

Но иногда ваш ответ может быть не таким простым, как в следующем примере.

Когда вы находитесь в блоке catch и блокируете finally одновременноreturnкогда будетreturnкакие?

public static int testFinally1() {
    try {
        Integer.parseInt("exception here");
    } catch (Exception e) {
        System.out.println("catch block 1");
        return 11;
    } finally {
        System.out.println("finally block 1");
        return 12;
    }
}

На самом деле, даже если блок catch имеетreturnлогика, которую должен выполнять блок finally, по-прежнему действительна. вышеуказанный метод,returnда12. выводить первымcatch block 1, затем выводfinally block 1, и, наконец, вернуться12.

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

public static int testFinally3() {
    try {
        System.out.println("start");
        Integer.parseInt("testFinally3");
        System.out.println("never run");
    } catch (Exception e) {
        System.out.println("catch block 3");
        return iamReturn();
    } finally {
        System.out.println("finally block 3");
    }
    return 31;
}

public static int iamReturn() {
    System.out.println("return block");
    return 666;
}

Подумайте, что будет выведено и возвращено при выполнении этого метода?

Не спешите сначала читать ответ, согласно правилам, которые мы нашли ранее, блок finally должен быть выполнен, а блок catch - нет.returnЧасть должна быть выполнена до блока finally. Тогда окончательный возврат должен быть666.

Ответ действительно есть. Вот последовательность вывода консоли:

start
catch block 3
return block
finally block 3

Исходя из этого, мы можем суммировать реальное время выполнения блока finally:

  1. Блок finally должен выполняться независимо от того, возникает ли исключение или существует лиreturn.
  2. Независимо от того, содержится ли возврат в блоке try или блоке catch, блок finally всегдаreturnПеред казнью.
  3. Если есть блок FINALLYreturn, затем в блоках try и блоках catchreturnШансов на казнь нет.

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

 public static int testFinally2() {
    try {
        System.out.println("start");
        return 21;
    } catch (Exception e) {
        System.out.println("catch block 2");
    } finally {
        System.out.println("finally block 2");
    }
    return 22;
}

Wechat-westcall