2015-02-12 1 views
1

Java 1.7 имеет Try-улов с ресурсами который обрабатывает закрывающихся ресурсов самого по себе. Означает, что при выполнении блока try-catch ресурсы автоматически закрываются.Использования примерки задвижки с ресурсами правильно

Я смущен о том, как заканчивается блок try-catch. Рассмотрим следующие два сценария.

Случай 1:

void function() 
{ 
    try (closable) 
    { 
     doSomething(); 
    } 
    catch (Exception) 
    {} 

    //at this point, the closable variable is closed 
    //by try-catch statement. No issues and it's clear. 
} 

Случай 2:

void function() 
{ 
    try (closable) 
    { 
     doSomething(); 
     return; 
    } 
    catch (Exception) 
    {} 

    //we never reached to this point, and this what 
    //makes me think.Is closable really closed before 
    //return statement or do we need to manually call 
    //closable.close() before returning? 
} 

Спасибо.

ответ

1

Закрывается ли действительно закрытым перед оператором возврата или нам нужно вручную вызвать функцию closable.close() перед возвратом?

Да, это называется для вас автоматически.

Чтобы проверить это для себя, вы можете установить контрольную точку в свой объект и запустить приложение в режиме debug. Сразу после выполнения return; вы должны увидеть, что JVM останавливает выполнение в методе close().

+0

Проверено .. Спасибо. – OmerHalit

1

Да, он закрыт.

Это:

try(Resource r = new Resource()) { 
    // do stuff 
} 

работает почти так же, как это: (он действует по-другому, если close бросает исключение)

Resource r = new Resource(); 
try { 
    // do stuff 
} finally { 
    r.close(); 
} 

и finally блоки выполняются, если вы возвращаетесь с середины блок try или оставьте его, доведя его до конца, или выбросьте исключение из него или выпрыгните из него с помощью break или continue.

0

Попробуйте ресурсы так же, как с помощью, наконец, блок до JDK 7.

finally { 
     if (resource != null) resource.close(); 
    } 

Так что ответ: Ресурс clodes Покинув попытка/поймать/наконец блокировать.

1

Вы можете использовать, наконец, блок для подтверждения, наконец, блок будет всегда выполнять, так что вы можете сделать двойную проверку на наконец блок: -

http://docs.oracle.com/javase/tutorial/essential/exceptions/finally.html

finaly 
{ 
if(!r.closed) 
r.close(); 
} 

Примечание: - наконец-то не будет работать в следующих сценарии How to avoid a scenario in which finally block does not execute

0

Вы не достигнете точки после блока try-catch во втором примере, потому что вы возвращаетесь из своего метода. Закрытие будет закрыто.

недействительными близко() бросает исключение

закрывает этот ресурс, отказываясь от каких-либо основополагающих ресурсов. Этот метод вызывается автоматически для объектов, управляемых оператором try-with-resources .

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

Разработчикам этого интерфейса также настоятельно рекомендуется не иметь метод close throw InterruptedException. Это исключение взаимодействует с с прерванным состоянием потока, а неправильное поведение во время выполнения, вероятно, возникает , если прервано прерывание. В более общем случае, если это вызовет проблемы для исключения, метод AutoCloseable.close не должен бросать его.

Обратите внимание, что в отличие от метода Closeable Close этот метод close is не требуется, чтобы быть идемпотентным. Другими словами, вызов этого закрытого метода более одного раза может иметь видимый побочный эффект, в отличие от Closeable.close, который не должен иметь эффекта, если вызвано более , чем один раз. Тем не менее, разработчики этого интерфейса сильно поощряют делать свои близкие методы идемпотентными.

Броски: исключение - если этот ресурс не может быть закрыт

Source.

Смежные вопросы