Использование try-catch с ресурсами правильно

1

Java 1.7 имеет try-catch с ресурсами, которые сами по себе обрабатывают близкие ресурсы. Означает, что при выполнении блока 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 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?
}

Благодарю.

Теги:

5 ответов

1
Лучший ответ

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

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

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

  • 0
    Проверено .. Спасибо.
1

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

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

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

Примечание: - наконец, не будет работать в следующих сценариях. Как избежать сценария, в котором, наконец, блок не выполняется

1

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

Эта:

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

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

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

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

0

Попробуйте использовать ресурсы так же, как использовать блок finally до JDK 7.

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

Таким образом, ответ таков: ресурс является клодом после выхода из блока try/catch/finally.

0

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

void close() throws Exception

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

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

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

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

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

Источник.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню