close()
выдает IOException
, потому что закрытие чего-либо обычно подразумевает вызов flush()
, и сброс может произойти сбой.Например, если вы потеряете соединение с сетью и введете socket.close()
, вы не сможете сбросить все, что у вас буферизовано, поэтому flush()
сгенерирует исключение.Поскольку данные могут быть потеряны, исключение проверяется, поэтому вы вынуждены иметь дело с такой возможностью.
Я думаю, что лучший способ справиться с этим:
try {
OutputStream socketStream = socket.getOutputStream();
socketStream.write(buf);
socket.close();
} catch (IOException e) {
// try to deal with your I/O error; do logging
} finally {
closeSilently(socket);
}
...
// Somewhere else, usually part of an utility JAR like Apache Commons IO
public static void closeSilently(Socket s) {
if (socket != null) {
try {
socket.close();
} catch (IOException e2) {
// do more logging if appropiate
}
}
}
Этот код будетнормально работать в общем случае.Если что-то пойдет не так (даже внутри close()
), это позволит вам перехватить исключение и сделать что-то перед тем, как безоговорочно закрыть сокет и проглотить все, что может выдать.