Исходя из С#, я обычно использовал бы этот шаблон при взаимодействии с потоками (обратите внимание, что я использую 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.
Что я здесь не понимаю? Я думал, что в конечном итоге блоки будут там, где вы должны поместить код очистки, и я думал, что закрытие потока здесь является идеальным кандидатом для этого?
Вы можете использовать библиотеку apache IOUtils. У него есть метод, который называется тихий.
finally {
IOUtils.closeQuietly(connectionStream);
}
В противном случае вам придется окружить метод close с помощью try/catch
finally {
if (connectionStream != null) {
try {
connectionStream.close();
} catch (Exception ignore) {
// Nothing to do
}
}
}
finally
является блоком кода, как и любой другой; также, если вы используете Java 7+, рассмотрите возможность использования оператора try-with-resourcesDataOutputStream.close
может генерироватьIOexception
поэтому вы должны окружить его блокомtry catch
. Кроме того, вы не проверяете, является лиConnectionStream
пустым. Вы можете получитьNullPointerException