TGViewer
Java Portal | Программирование Java Portal | Программирование @java_iibrary · 11.6K subscribers
Post #1673 2.46K
Часто про блок 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 всё равно выполнится

Это удобно, когда логика сложная и методы вызывают друг друга

👉 Java Portal
  • 👍 12
More from @java_iibrary
  1. Sep 30, 2026Docker прост, пока всё работает. Но что делать, если контейнер постоянно перезапускается,…
  2. Sep 29, 2026Эволюция языков программирования 1940-е → Машинный код ⬇️ 1950-е → Ассемблер ⬇️ 1960-е → F…
  3. Sep 29, 2026Большинство Java-разработчиков используют эти термины каждый день. Удивительно, но многие…
  4. Sep 28, 2026💡 Java: не создавайте ресурсоёмкие объекты, пока они действительно не понадобятся. ✅ Иниц…
  5. Sep 28, 2026Проблема в продакшене. Приложение зависло. Вы запускаете: jstack <pid> Через несколько сек…
  6. Sep 27, 2026Java-разработчики, CopyOnWriteArrayList создаёт копию всего внутреннего массива при каждом…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →