Какая польза от блока finally при попытке использовать ресурсы (Java 7)?

finally Блок в основном используется для предотвращения утечек ресурсов, которые могут быть достигнуты в close() метод класса ресурсов. Какой смысл в блоке finally с try-with-resources утверждение, например:

class MultipleResources {

    class Lamb implements AutoCloseable {
        public void close() throws Exception {
            System.out.print("l");
        } 
    }

    class Goat implements AutoCloseable {
        public void close() throws Exception {
            System.out.print("g");
        } 
    }

    public static void main(String[] args) throws Exception {
        new MultipleResources().run();
    }

    public void run() throws Exception {
        try (Lamb l = new Lamb(); Goat g = new Goat();) {
            System.out.print("2");
        } finally {
            System.out.print("f");
        }
    }
}

Ссылка: К. Сеирра, Б. Бейтс Книга OCPJP

3 ответа

Как в обычном try-catch-finally блок - finally Блок используется, когда вы хотите, чтобы что-то происходило всегда, независимо от того, try блок успешен или нет.

Я думаю, что ваш вопрос заключается в предоставлении некоторого варианта использования, когда это действительно полезно. Попробуйте представить себе ситуацию, когда вам нужно сообщить одному коллаболатору (или опубликовать событие), что ваша обработка завершена - независимо от ее результата. Затем вы можете положить в finally заблокировать код, который отвечает за объявление об окончании обработки.

Пожалуйста, обратите внимание, что когда некоторые операции в try-with-resources блок без catch выдает исключение, код, следующий за этим блоком, не будет выполнен.

Код в finally блок всегда выполняется, если только поток, выполняющий код или JVM, не завершен.

Это гарантирует, что любые выделенные вами ресурсы будут очищены в finally несмотря на.

Java документ имеет подробное объяснение наконец.

Вероятно, эта программа продемонстрирует вам работу ключевого слова finally в Java и важность ключевого слова finally

class Example {
public static void main(String args[]) {
    int i = 1, j = 0;

    try {
        System.out.println("The result is " + i / j);
    }
    catch (ArrayIndexOutOfBoundsException e) {
        System.out.println("This is statement would never executed");
        System.out.println("Because catch() block is not catching exception from try");
    }
    finally {
        // finally block will always execute

        System.out.println("This statement will always executed");
        System.out.println("Becuase this is finally");
    }

    // These 3 statements would never executed
    // They will execute if catch block catches the Exception from try

    System.out.println("This is statement would never executed");
    System.out.println("Because catch() block is not catching exception from try");
    System.out.print(" and program is interrupted after finally");


    }
}
Другие вопросы по тегам