В большинстве случаев я считаю, что лучше не перехватывать исключения ввода-вывода и просто использовать try-finally:
final InputStream is = ... // (assuming some construction that can't return null)
try {
// process is
...
} finally {
is.close();
}
За исключением FileNotFoundException, вы, как правило, не можете "обойти" IOException. Единственное, что остается сделать, это сообщить об ошибке, и вы, как правило, будете обрабатывать ее дальше по стеку вызовов, поэтому я считаю, что лучше распространить исключение.
Поскольку IOException является проверенным исключением, вам нужно будет объявить, что этот код (и любой из его клиентов) throws IOException. Это может быть слишком шумно, или вы можете не раскрывать детали реализации использования ввода-вывода. В этом случае вы можете обернуть весь блок обработчиком исключений, который помещает IOException в RuntimeException или абстрактный тип исключения.
Подробно: мне известно, что приведенный выше код принимает любое исключение из блока try, когда операция close в блоке finally создает IOException. Я не думаю, что это большая проблема: как правило, исключение из блока try будет тем же IOException, которое вызывает сбой close (т.е. довольно редко ввод-вывод работает нормально, а затем выходит из строя в момент закрытия) . Если это вызывает беспокойство, возможно, стоит потрудиться, чтобы "замолчать" закрытие.
person
Bruno De Fraine
schedule
01.10.2008
fisне может быть нулевым в момент, когда вы его тестируете. Он может быть нулевым в отсутствующем блокеfinally, где вы должны его тестировать и закрывать. Но вопрос устарел с момента введения синтаксиса «попробуйте с ресурсами». - person user207421   schedule 28.04.2015