Java Закрытие IOStream в окончательной выдаче ошибки: необработанное исключение: java.io.IOException

1

Исходя из С#, я обычно использовал бы этот шаблон при взаимодействии с потоками (обратите внимание, что я использую Java-классы здесь, но я имею в виду шаблон в С#):

HttpURLConnection ServiceConnection;
DataOutputStream ConnectionStream;

try {
    ServiceConnection = (HttpURLConnection) ServiceUrl.openConnection();
    ConnectionStream = new DataOutputStream(ServiceConnection.getOutputStream());

    //...
}
finally {
    ConnectionStream.close();
    ServiceConnection.Disconnect();
}

По моему мнению, для проверенных исключений, таких как IOException, мне нужно включить блок catch. Справедливо. Поэтому я изменил свой код следующим образом:

HttpURLConnection ServiceConnection;
DataOutputStream ConnectionStream;

try {
    ServiceConnection = (HttpURLConnection) ServiceUrl.openConnection();
    ConnectionStream = new DataOutputStream(ServiceConnection.getOutputStream());

    //...
}
catch (MalformedURLException e1) {
    //...
}
catch (IOException e) {
    //...
}
finally {
    ConnectionStream.close();
    ServiceConnection.Disconnect();
}

Однако этот код дает мне следующую ошибку: Unhandled Exception: java.io.IOException в строке, которую я пытаюсь закрыть потоком в блоке finally.

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

  • 1
    Блок кода в finally является блоком кода, как и любой другой; также, если вы используете Java 7+, рассмотрите возможность использования оператора try-with-resources
  • 0
    DataOutputStream.close может генерировать IOexception поэтому вы должны окружить его блоком try catch . Кроме того, вы не проверяете, является ли ConnectionStream пустым. Вы можете получить NullPointerException
Теги:
exception-handling

1 ответ

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

Вы можете использовать библиотеку apache IOUtils. У него есть метод, который называется тихий.

finally {
        IOUtils.closeQuietly(connectionStream);
    }

В противном случае вам придется окружить метод close с помощью try/catch

finally {
        if (connectionStream != null) {
            try {
                connectionStream.close();
            } catch (Exception ignore) {
                // Nothing to do
            }
        }
    }

Ещё вопросы

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