tgoop.com/Java_Iibrary/1673
Create:
Last Update:
Last Update:
Часто про блок finally пишут, что он всегда выполнится, даже если в коде случилась ошибка
Пример из разряда «классика жанра»
public class FinallyExample {
public static void main(String[] args) {
try {
System.out.println("Старт");
int result = 10 / 0; // тут бахнет деление на ноль
} catch (ArithmeticException e) {
System.out.println("Ошибка: " + e.getMessage());
} finally {
System.out.println("Этот блок всё равно выполнится");
}
}
}Да, при делении на ноль выпадет исключение, но перед завершением работы всё, что внутри
finally, всё равно выполнитсяНо есть ситуации, когда
finally не доживёт до выполнения. Напримерpublic class FinallyExample {
public static void main(String[] args) {
try {
System.out.println("Старт");
System.exit(0); // мгновенный выход из программы
int result = 10 / 0;
} catch (ArithmeticException e) {
System.out.println("Ошибка: " + e.getMessage());
} finally {
System.out.println("Этот блок уже не увидим");
}
}
}Вызов
System.exit() или убийство процесса извне (например, kill PID) не даст finally сработатьТеперь к более интересному
Представим, что у нас есть цепочка методов, где в конце мы хотим сделать какие-то действия в любом случае — например, зафиксировать результат в логах или отправить уведомление
Пусть методы вызывают друг друга вот так:
main → firstLogic → secondLogic → thirdLogic → fourthLogicПример
public static void main(String[] args) {
try {
firstLogic();
} finally {
System.out.println("FINALLY MAIN"); // логируем результат
}
}
public static void firstLogic() {
secondLogic();
}
public static void secondLogic() {
try {
thirdLogic();
} finally {
System.out.println("FINALLY SECOND"); // отправляем уведомление
}
}
public static void thirdLogic() {
fourthLogic();
}
public static void fourthLogic() {
System.out.println("D");
throw new RuntimeException();
}В этой схеме исключение может вылететь и в
thirdLogic, и в fourthLogicНам всё равно, где именно упало — код внутри
finally, в main и secondLogic всё равно выполнитсяЭто удобно, когда логика сложная и методы вызывают друг друга
