Исключение — очень важная концепция в ядре 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:
- Блок finally должен выполняться независимо от того, возникает ли исключение или существует ли
return
. - Независимо от того, содержится ли возврат в блоке try или блоке catch, блок finally всегда
return
Перед казнью. - Если есть блок FINALLY
return
, затем в блоках 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;
}