В большинстве случаев я считаю, что лучше не перехватывать исключения ввода-вывода и просто использовать 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