Урок 17

Оператор finally


Когда генерируется исключение, выполнение метода направляется по нелинейному пути. Если файл открывается в начале метода и закрывается в конце, то вряд ли кого-нибудь устроит, что код, закрывающий файл, будет обойден механизмом обработки исключений. Для таких непредвиденных обстоятельств и служит оператор finallу.

Оператор finallу образует блок кода, который будет выполнен по завершении блока операторов try/catch, но перед следующим за ним кодом. Блок оператора finallу выполняется независимо от того, сгенерировано ли исключение или нет. Если исключение сгенерировано, блок оператора finallу выполняется, даже при условии, что ни один из операторов catch не совпадает с этим исключением. В любой момент, когда метод собирается возвратить управление вызывающему коду из блока оператора try/саtch (через необработанное исключение или явным образом через оператор return), блок оператора finallу выполняется перед возвратом управления из метода.

Пример 1. Оператор finally

public class FinallyUse {
    // Выход из метода через исключение
    public static void procA() {
        try {
            System.out.println("Внутри procA");
            throw new RuntimeException("demo");
        } finally {
            System.out.println("finally для procA ");
        }
    }

    // Возврат изнутри try-блока
    public static void procB() {
        try {
            System.out.println("Внутри procB");
            return;
        } finally {
            System.out.println("finally для procB ");
        }
    }

    // Нормальное выполнение try-блока
    public static void procC() {
        try {
            System.out.println("Внутри procC");
        } finally {
            System.out.println("finally procC");
        }
    }

    public static void main(String[] args) {
        try {
            procA();
        } catch (Exception e) {
            System.out.println("Исключение выброшено");
        }
        procB();
        procC();
    }
}


1 comments
  1. hmma0723
    Jun 14, 2017
    I think it can be used in the case: Map where the key is an attribute of the entity.
Leave your comment: