Карта / Исключения / try / catch / finally

try / catch / finally

Исключение — это сигнал об ошибке во время работы программы. Java не падает молча: она «бросает» исключение, которое всплывает вверх, пока кто-то его не поймает. Поймал → программа живёт. Не поймал → падает.

try { 10 / 0 } рискованный код ⚠ ошибка! поймали не поймали catch (e) { ... } обработали ошибку 💥 программа упала программа идёт дальше
try {
    int x = 10 / 0;            // тут возникнет ошибка
} catch (ArithmeticException e) {
    System.out.println("Поймали: " + e.getMessage());
} finally {
    System.out.println("Выполнится в любом случае");
}

finally выполняется всегда — поймали исключение или нет. Туда кладут код, который обязан отработать (закрыть файл, освободить ресурс).

Под капотом

Раскрутка стека (stack unwinding). Если метод бросил исключение и сам его не поймал, JVM снимает его фрейм со стека и ищет catch в вызвавшем методе — и так вверх по стеку вызовов, пока не найдёт подходящий catch. Не нашла нигде — поток завершается и печатается stack trace.

b() — throw new Exception a() — не ловит, пропускает main() — catch ловит ищет catch не нашли catch нигде → поток падает, печатается stack trace
🎤 Закрыл тему, если можешь объяснить:
• что такое исключение, что делают try/catch/finally;
• как работает раскрутка стека при непойманном исключении (если дошёл до 3-го слоя).