Java - Соединение / Поток уже закрыт, если возникает Исключение, и как правильно его обработать? - PullRequest
0 голосов
/ 19 ноября 2018

Мне интересно, если в моем коде есть какое-либо соединение или поток, который должен быть закрыт для освобождения ресурсов, что это означает для самого экземпляра соединения?

Пример кода:

CustomConnection connection;
try{
    connection = //some code that opens a connection
    //some code using the connection
}catch(IOException){
    //Some logging and Handling of IOExceptions
}finally{
    //resources cleanup
    try{
        connection.close();
    }catch(IOException){
        //Some Logging
        //What else should be done here?
        //Is my Connection closed at this point and can I just move on?
        //Or should there be anything else done here 
        //to ensure that the connection is actually closed?
    }
}

Например, если у меня есть открытое TCP-соединение, скажем, SQL-сервер, и я не могу закрыть его, потому что сервер сломался или мое устройство больше не может связаться с устройством.Я бы, очевидно, получил IO или, в этом случае, SQLException.Если так:

  1. Должен ли я считать ресурс или сокет действительно освобожденным benn?
  2. Будет ли JVM или ОС обрабатывать его сверхурочно?(ОС, вероятно, в конечном итоге сделает это, но в данном случае речь идет о том, что на самом деле является хорошей практикой программирования)
  3. Должен ли я решить проблему самостоятельно, попробовав

Редактировать 1: Язнать о конструкции "попробуй с ресурсами".Мне просто интересно, как обрабатывать закрытие соединения, если используемое соединение не поддерживает AutoCloseable.

1 Ответ

0 голосов
/ 19 ноября 2018

Я бы хотел CustomConnection реализовать интерфейс AutoClosable, чтобы его можно было использовать в операторе try-with-resources:

try (CustomConnection connection = ...) {

} catch (IOException e) {
    // connection is not in scope here, and it is closed.
}

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

Примечание : оператор try-with-resources может иметь блоки catch и finally так же, как обычный оператор try.В операторе try-with-resources любой блок catch или finally запускается после закрытия объявленных ресурсов.

Используя это, чтобы ответить на ваш вопрос, ваши ресурсы будут закрыты при вводе либо *Блок 1016 * или finally.


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

Исключение может бытьвыдается из блока кода, связанного с оператором try-with-resources.В примере writeToFileZipFileContents, исключение может быть выдано из блока try, и до двух исключений может быть выдано из оператора try-with-resources, когда он пытается закрыть объекты ZipFile и BufferedWriter.Если исключение выдается из блока try, а одно или несколько исключений выбрасываются из оператора try-with-resources, то эти исключения, выбрасываемые из оператора try-with-resources, подавляются, и исключение, выбрасываемое блоком, является единственнымэто бросается методом writeToFileZipFileContents.Вы можете получить эти исключенные исключения, вызвав метод Throwable.getSuppressed из исключения, созданного блоком try.

...