2014-09-21 2 views
3

Я читал эту link для try-with-resources и он говорит:Зачем закрывать метод java.lang.AutoCloseable throws Исключение, но закрытый метод java.io.Closeable throws IOException?

Тесный метод интерфейс Closeable генерирует исключения типа IOException в то время как близкий метод интерфейса AutoCloseable генерирует исключения типа Exception.

Но почему? Близкий метод AutoCloseable мог бы также выброшен IOException есть ли пример, который поддерживает, что близкий метод AutoCloseable должен бросать исключения типа Exception

+0

Я думаю, что это просто плохое решение на части на языке мейкеров. Это требует, чтобы вы использовали общее исключение везде, где вы используете try-with-resources. –

ответ

7

интерфейс AutoClosable расположен в java.lang и предназначен для применения к любому ресурсу, который должен «автоматически» (try-with-resources). AutoClosable не должен быть ресурсом, освобожденным от иона. Таким образом, интерфейс не может делать каких-либо предположений о конкретном исключении.

С другой стороны Closable находится в java.io и простирается AutoClosable, поскольку Closable является AutoClosable для Io ресурсов. Поэтому он заявляет, что IOException s может быть выброшен на закрытие.

Например ... java.sql.Connection является AutoClosable, потому что это близко метод бросает SQLException и SQLException не является IOException. Подумайте о БД в памяти, и имеет смысл, что закрытие соединения sql не должно вызывать IOException.

EDIT

ответил еще одно сомнение то есть почему AutoClosable находится под пакет java.lang. Благодарю.

Я думаю, что он расположен в java.lang, потому что try-with-resources был введен в качестве функции языка в Java 1.7. Таким образом, java.lang

+0

ответил еще на одно сомнение: почему 'AutoClosable' хранится в пакете' java.lang'. Благодарю. – Vishrant

+0

@Vishrant Я обновил свой ответ ... Поздно, но я надеюсь, не слишком поздно :) –

+0

На самом деле, ответил, почему 'AutoCloseable' был создан вообще, вместо того, чтобы просто повторно использовать' Closeable'. – entonio

4

Closeable распространяет AutoCloseable, но могут существовать другие конкретные интерфейсы, расширяющие этот интерфейс. Например .:

public interface MyCloseable extends AutoCloseable { 
    void close() throws RunTimeException; 
} 

Они хотели иметь интерфейс, который может быть использован во многих случаях, и именно поэтому они решили использовать Exception, потому что он также работает для других типов исключений.

Смежные вопросы