Зачем закрывать метод java.lang.AutoCloseable выдает исключение, а закрывать метод java.io.Closeable выбрасывает IOException?
Я читал эту ссылку для try-with-resources
и это говорит:
Близкий метод
Closeable
интерфейс выдает исключения типаIOException
в то время как метод закрытияAutoCloseable
интерфейс выдает исключения типаException
,
Но почему? Близкий метод AutoCloseable
мог бы также бросить IOException
Есть ли пример, который поддерживает этот близкий метод AutoCloseable
должен бросить исключения типа Exception
3 ответа
AutoClosable
интерфейс расположен в java.lang
и предназначен для применения к любому ресурсу, который должен быть закрыт "автоматически" ( try-with-resources). AutoClosable
не должен быть освобожденным ресурсом. Поэтому интерфейс не может делать какие-либо предположения о конкретном исключении.
С другой стороны Closable
находится в java.io
и расширяется AutoClosable
потому что Closable
является AutoClosable
за ресурсы. Поэтому он заявляет, что IOException
S могут быть брошены на близком расстоянии.
Например... java.sql.Connection
является AutoClosable
потому что это метод близких бросков SQLException
и SQLException
это не IOException
, Подумайте о БД в памяти, и имеет смысл, что закрытие соединения SQL не должно бросать IOException
,
РЕДАКТИРОВАТЬ
ответил еще на один вопрос, т.е. почему AutoClosable хранится в пакете java.lang. Благодарю.
Я думаю, что это находится в java.lang
потому что try-with-resources был представлен как языковая функция в Java 1.7. таким образом java.lang
В дополнение к возможности создавать некоторые другие типы исключений, чем IOException
За одним красивым и распространенным случаем можно легко наблюдать:
Можно переопределить интерфейс, чтобы не иметь throws
декларация вообще, что позволяет try
пишется без явной обработки исключений.
В нашем коде у нас есть интерфейс Searcher
заявлено следующим образом
public interface Searcher<V> extends AutoCloseable {
Stream<V> search();
@Override
void close();
}
Это позволяет следующее использование Searcher
экземпляры:
try (Searcher<Datatype> dataTypeSearcher = new DataTypeSearcher(query)) {
return dataTypeSearcher.search();
}
// without any catch statements
Если нет throws
декларация присутствовала на AutoCloseable
вышеупомянутое было бы единственным использованием, поскольку было бы невозможно переопределить AutoCloseable
интерфейс, генерирующий исключение, не объявленное на родительском. То, как это делается в настоящее время, возможны оба варианта.
Closeable
продолжается AutoCloseable
, но могут быть и другие конкретные интерфейсы, расширяющие этот интерфейс. Например:
public interface MyCloseable extends AutoCloseable {
void close() throws RuntimeException;
}
Они хотели иметь интерфейс, который можно использовать во многих случаях, и именно поэтому они решили использовать Exception
потому что это также работает для других типов исключений.