我們在使用資源的時候,必須關閉資源,比如使用jdbc連接或者inputStream的時候,必須在finally中將資源關閉。然而有的時候我們會忘記關閉資源。那麼有沒有更好的方法呢?
SqlSession sqlSession = sqlSessionFactory.openSession()
try {
}finally{ sqlSession.close(); }
從jdk1.7開始,Java 7增強了try語句的功能——它允許在try關鍵字後跟一對圓括號,圓括號可以聲明,初始化一個或多個資源,此處的資源指得是那些必須在程序結束時必須關閉的資源(比如數據庫連接,網絡連接等),try語句在該語句結束時自動關閉這些資源。這種稱爲try-with-resources語句。
try (SqlSession sqlSession = sqlSessionFactory.openSession()) { //...... }
像這樣的話,執行完sqlsession會自動關閉,不用我們在finally中關閉,也再也不用擔心忘記關閉了。
那麼爲什麼這樣可以自動關閉資源呢?是不是所有的資源都可以這樣關閉呢?
實際上只要這些資源實現類實現了Closeable或AutoCloseable接口,就可以自動關閉。比如Sqlsession它就是extends Closeable, Closeable extends AutoCloseable。
幾乎所有的資源都可以用這種方式實現自動關閉資源,比如OutputStream,BufferedReader,PrintStream,InputStream等,都可以。據說到目前爲止,只有JavaMail Transport對象不能利用這種方式實現自動關閉。
注意:如果try()裏面有兩個資源,用逗號分開,資源的close方法的調用順序與它們的創建順序相反。
帶有資源的try語句可以像一般的try語句一樣具有catch和finally塊。在try-with-resources語句中,任何catch或finally塊都是在聲明的資源被關閉後纔會執行的。