На моем взгляде close()
является окончательным методом вы звоните в каком-то логике, поэтому он не должен потерпеть неудачу, даже если это не то, что следует рассматривать в классе, а не бросать исключение.
Хорошо иметь мнения.К сожалению, мнения не всегда звучат :-)
Рассмотрим, что происходит, когда вы закрываете FileOutputStream
завернутое в BufferedOutputStream
:
- Любые выдающиеся данные в буфере очищено.
- Основной файловый дескриптор «закрыт».
Первая из этих операций может сбой, например, если файловая система заполнена.
Теперь представьте, что приложение записывало критический файл; например программа «adduser», которая обновляет «/ etc/passwd» в системе UNIX/Linux. Естественно, приложение будет делать это в два этапа. Сначала он выпишет новую версию файла. Затем, если это удастся, он переименует новый файл в путь к файлу старого файла. (Или что-то в этом роде)
Но если мы внедрили close()
, как вы этого хотите, уровень приложения не знал бы, что close()
не смог записать все данные ... и «adduser» перейдет к переименованию новый неполный «passwd» файл поверх старой версии. По электронной почте Ой !! Вы только что уничтожили «/ etc/passwd», и никто больше не может войти в систему. (Я надеюсь, что у вас есть резервная лента под рукой :-))
Урок:IOExceptions
брошенной close()
может быть важным.
Вы правы, конечно, но что-то не чувствует себя хорошо в письменной форме, что структура.
Ну, синтаксис «try-with-resources» делает это приятнее. Тем не менее, вы не можете избежать сделки с IOException
на каком-то уровне, если у вас нет свободного объявления о том, что close()
по статическому типу connection
не генерирует исключение.
Попробовать-с-ресурсов версия будет выглядеть следующим образом:
try (Connection c1 = openConnection();
Connection c2 = openConnection()) {
// so stuff
}
Оба c1
и c2
будут закрыты, даже если один из них close()
методов бросает исключение. Но вам все равно придется иметь дело с этим исключением; например в прилагаемом обработчике. (Интересные вещи происходят, когда исключения выбрасываются внутри try
и в закрытии ресурса; смотрите раздел «Исключения» подавлено в http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html.)
'близко()' метод какого класса вы имеете в виду? –
Было бы полезно увидеть код и конкретное исключение. – Dan
Вы можете уточнить, что вы пытаетесь закрыть, и в каком классе он принадлежит? – Miller