2016-05-31 4 views
1

Будут ли попытки-с-ресурсами всегда закрывать ресурс независимо от состояния ошибки? Я имею в виду рассмотреть ниже код:Будут ли попытки-с-ресурсами всегда закрывать ресурсы

try (BufferedReader br = 
       new BufferedReader(new FileReader(path))) { 
    return br.readLine(); 
} 

Будет br всегда быть закрыты? Я прочитал Oracle документацию, которая говорит:

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

Так это будет работать, работает ли программа нормально или бросает исключение. Но как насчет таких условий, как System.exit или JVM аварии? Я знаю, что эти условия не будут работать для блока finally. Итак, есть ли условие, при котором try-with-resources терпят неудачу?

Это просто я прошу любопытства, может кто-то пролить свет на это?

+6

Нет, он также не будет закрывать ресурсы, если ядерный взрыв испарит компьютер. Но, к счастью, нам не нужно беспокоиться об этих случаях. – Kayaman

+0

Почему саркастический? Неправильно спросить сомнения? –

+0

Официальные документы не говорят прямо (https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html), но он, похоже, склоняется в сторону закрытия. Я предполагаю, что «после завершения программы с ним» будет после завершения попытки (ресурса). –

ответ

5

try-with-resource - это просто синтаксический сахар, чтобы избавить вас от хлопот с предложением finally. Ничего «ява-иш», что происходит внутри try блока будет препятствовать ресурсу от закрытия - возвращение, метание исключения и т.д.

Все, что завершает JVM внезапно (например, вызов System#exit, убивая процесс в JVM, в отсоединении компьютер и т. д.) не будут обрабатываться, так как это не обрабатывается старомодным предложением finally.

+2

Обратитесь к [JLS Sec 14.20.3.1] (https://docs.oracle.com/javase/specs/jls/se8/html/jls-14.html#jls-14.20.3.1) для формы «desugared» блок try-with-resources. –

0

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