Какая польза от блока 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");
}
}