2014-09-21 73 views
3

我在讀這linktry-with-resources和它說:爲什麼關閉java.lang.AutoCloseable方法拋出異常,但是關閉java.io.Closeable方法拋出IOException?

AutoCloseable接口的接近方法拋出Exception類型的異常的Closeable接口的接近方法拋出IOException類型的異常。

但是爲什麼?的AutoCloseable close方法還能夠拋出IOException是否有支持的AutoCloseable close方法必須拋出類型Exception

+0

我認爲這對語言製造者來說只是一個糟糕的決定。無論您使用try-with-resources,它都需要您捕獲通用異常。 – 2017-12-02 16:32:00

回答

7

AutoClosable接口位於java.lang,旨在應用於需要任何資源的例外情況的任何實例'自動'關閉(try-with-resources)。該AutoClosable不能是一個孤立的資源。所以這個接口不能對任何具體的異常做出任何假設。

在另一方面Closable位於java.io和延伸AutoClosable,因爲一個Closable爲IO資源的AutoClosable。因此它聲明IOException可以被關閉。

例如......一個java.sql.ConnectionAutoClosable,因爲它靠近方法拋出SQLExceptionSQLException不是IOException。在內存數據庫中考慮一下,關閉sql連接一定不能拋出IOException

EDIT

回答一個更疑問即爲什麼AutoClosable被java.lang包下保持。謝謝。

我認爲它位於java.lang,因爲try-with-resources是作爲Java 1.7中的語言功能引入的。因此,java.lang

+0

回答了另一個疑問,即爲什麼'AutoClosable'保存在java.lang'包下。謝謝。 – Vishrant 2014-09-21 16:02:36

+0

@Vishrant我更新了我的答案...遲了,但我希望不會太晚:) – 2014-12-29 09:45:44

+0

實際上,回答了爲什麼'AutoCloseable'被創建而不是僅僅重用'Closeable'。 – entonio 2017-07-13 18:07:03

4

Closeable延伸AutoCloseable,但可能有其他特定的接口擴展此接口。例如: -

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

他們希望有一個可以在很多情況下可以使用的接口,這就是爲什麼他們決定使用Exception,因爲它也適用於其他類型的異常。

相關問題