Зачем закрывать метод 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 за ресурсы. Поэтому он заявляет, что IOExceptionS могут быть брошены на близком расстоянии.

Например... 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 потому что это также работает для других типов исключений.

Другие вопросы по тегам