Java中如何通過try優雅地釋放資源?

2020-12-16 計算機java編程

時間緊迫,長話短說,今天,小明給大家同步一個知識點,使用try-with-resources來優雅地關閉資源。

1. 背景

其實,在JDK 7就已經引入了對try-with-resources的支持,它的主要作用就是解放小明和小明小夥伴們的雙手,幫助我們自動釋放使用過的資源(比如輸入、輸出流)。

2. 例子

如何才能使用這個自動關閉資源的騷操作呢?我們只需要在try內聲明和初始化資源即可,如下所示:

這樣,當我們寫入文件時,只需要將心思放在輸入的內容就行啦。

3.使用try-with-resources的好處

在很久很久以前,你是不是和小明一樣每每操作輸入流、輸出流的時候,用的都是try-catch-finally代碼塊?

現在,答應我好嘛,作為小明的小夥伴,看完這篇文章後,再寫代碼時,不要再將就,務必使用try-with-resources會更小明(優雅)一些。

接下來,我們簡單地做個比較:

之前的小明

點評

整體感覺很傳統,很冗長。

現在的小明

點評

整體感覺很輕巧,很優雅。

4. 還可以控制多個資源哦

如果我們想一邊控制輸入、一邊控制輸出怎麼辦?

通通放進去!如圖所示

5.幕後功臣:Closeable

為什麼把資源放進try-with-resources,我們就可以束手旁觀,高枕無憂呢?原來,要想合法進去try-with-resources,不被報警,是需要門票的:實現CloseableAutoCloseable接口,並重寫close方法。就像這樣:

6.多個資源的情況下如何順序關閉呢?

劇透:先創建的資源,最後關閉。

這個故事是這樣講的:小明和小紅一起打王者榮耀……

小明

小紅

全軍出擊

故事縱覽

提問:結局是不是和劇透一致?

7. 補充

我們使用try-with-resources的時候不僅可以優雅地釋放資源,而且還可以傳統一些,照常使用catchfinally哦。

8. 總結

經過小明這麼一番生動的講解:

你是否知道了什麼是try-with-resources

你是否知道了如何用try-with-resources替換try-catch-finally

你是否知道了AutoCloseable構建自定義資源以及關閉資源的順序?

相關焦點

  • java中資料庫:JDBC的使用
    包中)。通過JDBC,我們可以用java編寫程序,實現與特定的資料庫進行連接,向資料庫發送SQL語句,實現對資料庫的特定操作,並對資料庫返回的結果進行處理。JDBC編程步驟:步驟一:根據應用程式所用的資料庫,選擇JDBC驅動程序類型;步驟二:連接到資料庫,得到Connection對象;步驟三:通過Connection創建Statement對象;步驟四:使用Statement對象提交SQL語句;步驟五:操作結果集;步驟六:回收資料庫資源。
  • java的try、catch、finally
    java如何通過異常信息定位問題原因》,可以幫助大家通過異常定位問題所在。這個時候就是java中的try、catch、finally大展身手的時候了。說到try、catch、finally,大家看看下面這段代碼,最後執行輸出的結果應該是什麼呢?帶著這個問題,我們往下看看吧。
  • Java 中關於 try、catch、finally 中的細節分析
    中關於try、catch、finally中一些問題下面看一個例子(例1),來講解java裡面中try、catch、finally的處理流程public class TryCatchFinally {    @SuppressWarnings("finally
  • java中關於try、catch、finally中的細節分析
    堅持更新java綜合性知識,自助領取海量java資料看了一位博友的一片文章,講解的是關於java中關於try、catch
  • Java中關於try、catch、finally中的細節分析
    try、catch、finally中一些問題下面看一個例子(例1),來講解java裡面中try、catch、finally的處理流程public class TryCatchFinally {    @SuppressWarnings("finally")    public static final String test() {
  • 在程序中如何正確地創建和銷毀軟體應用系統中文件IO流對象實例
    軟體項目實訓及課程設計指導——如何正確地創建和銷毀軟體應用系統中文件IO流對象實例1、Java文件輸入輸出(讀寫)相關的技術基礎知識(1)流(Stream)它是通過緩衝機制將數據從生產者(如鍵盤、磁碟文件、內存或其他設備
  • 為什麼不推薦使用try-catch-finally處理Java異常?
    這篇文章是我近期看了《Effective java》一書中總結的,來自其中第九條。為了對其理解的更加透徹,因此重新分析了一下,並加入了一些其他點。  「    本文的所有例子均在本地代碼運行完畢       基於JDK版本1.8,運行環境eclipse       本文類名:TryWithResources,下文的堆棧信息也以此為基礎    」在java開發中,一些網絡連結或者是文件資源都需要程式設計師去手動調用close方法關閉,比如InputStream、OutputStream和java.sql.Connection
  • try{}catch的隱藏(如何優雅的實現異常塊)
    但是繁瑣的try{}caht嵌套在代碼裡,看著很不舒服,這裡我們不討論性能,就代碼來講,來看看如何將他隱藏起來。原理是不變的。變得是寫法。下面我們來看如何優雅的處理異常塊。 在這之前。
  • 如何優雅的設計 Java 異常
    本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫導語異常處理是程序開發中必不可少操作之一,但如何正確優雅的對異常進行處理確是一門學問
  • 如何優雅地列印一個Java對象?
    於是痛下決心,準備通過輸出的方式倒逼輸入,以此來修煉自己的內功,從而進階成為一名真正意義上的大神。與此同時,希望這些文章能夠幫助到更多的讀者,讓大家在學習的路上不再寂寞、空虛和冷。為了更好的輸入,我選擇 Stack Overflow 作為戰鬥的第一線,畢竟很多前輩都在強烈推薦。本篇文章,我們來探討一下如何優雅地列印一個Java對象。
  • Java筆試面試總結—try、catch、finally語句中有return 的各類情況
    正文本篇文章主要是通過舉例的方式來闡述各種情況,我這裡根據 try-catch-finally 語法塊分為兩種大情況討論:try-catch 語法塊和 try-catch-finally 語句塊,然後再在每種情況裡再去具體討論。
  • 為什麼推薦使用try-with-resources代替try-finally
    這篇文章是我近期看了《Effective java》一書中總結的,來自其中第九條。為了對其理解的更加透徹,因此重新分析了一下,並加入了一些其他點。本文的所有例子均在本地代碼運行完畢基於JDK版本1.8,運行環境eclipse本文類名:TryWithResources,下文的堆棧信息也以此為基礎在java開發中,一些網絡連結或者是文件資源都需要程式設計師去手動調用close
  • 聊聊Java當中的一些小技巧
    stream有很多非常直觀和好用的方法,例如sum,count,distinct等等減少非空判斷,優雅地使用Objects工具jdk1.7提供了Objects工具,使用直觀方便,很多方法中幫我們做了非空判斷,減少!=null的代碼
  • Java 中的異常和處理詳解
    異常處理機制能讓程序在異常發生時,按照代碼的預先設定的異常處理邏輯,針對性地處理異常,讓程序盡最大可能恢復正常並繼續執行,且保持代碼的清晰。Java中的異常可以是函數中的語句執行時引發的,也可以是程式設計師通過throw 語句手動拋出的,只要在Java程序中產生了異常,就會用一個對應類型的異常對象來封裝異常,JRE就會試圖尋找異常處理程序來處理異常。
  • 大狗乾貨鋪:13個java編程中的小技巧
    1> try、catch、finally語句中,在如果try語句有return語句,則返回的之後當前try中變量此時對應的值,此後對變量做任何的修改,都不影響try中return的返回值2> 如果finally塊中有return 語句,則返回try或catch中的返回語句忽略。
  • Java之戳中痛點之 synchronized 深度解析|java|override|author|...
    Lock或Synchronized    如何提高性能、JVM如何決定哪個線程獲取鎖    總結    後續會有代碼演示,測試環境 JDK8、IDEA  一、簡介  1、作用  能夠保證在同一時刻最多只有一個線程執行該代碼,以保證並發安全的效果。
  • Java簡潔之道:如何優雅地玩轉List
    在Java編程中,List是使用率最高的集合類型。對於List存儲數據的處理,如排序、篩選等操作,我們通常使用Iterator或者Foreach的方式對集合進行遍歷,並通過if.else.判斷完成數據的處理,代碼如下所示,這樣的代碼看起來十分冗長,不易於維護。
  • Java並發包源碼學習系列:CLH同步隊列及同步資源獲取與釋放
    學習獨佔式資源獲取和釋放的流程。CLH隊列的結構我在Java並發包源碼學習系列:AbstractQueuedSynchronizer#同步隊列與Node節點已經粗略地介紹了一下CLH的結構,本篇主要解析該同步隊列的相關操作,因此在這邊再回顧一下:AQS通過內置的FIFO同步雙向隊列來完成資源獲取線程的排隊工作,內部通過節點head【實際上是虛擬節點,真正的第一個線程在head.next的位置】和tail
  • Java面試總結之Exception
    Java中Error是不能被java程序捕獲的,出現了Error整個個程序就會中斷。而Exception又可分為可檢查和不可檢查的類型。可檢查的異常就是在JVM在編譯期間進行檢查的,這個異常可以在編碼時在代碼中顯示的捕獲。不可檢查異常是代碼在運行過程中拋出出來的,如NullPointerException,ArrayIndexOutOfBoundsException等。
  • 如何正確地創建和銷毀軟體應用系統中網絡通訊中的Socket對象實例
    在JDK API中與Socket通信有關的各個接口和功能類都定義在java.net包中,而在對應的伺服器端程序中則需要創建出ServerSocket類的對象實例。Socket類的對象實例以及時釋放所佔的系統資源當構造出Socket類的對象實例時,Java虛擬機JVM系統同樣也需要為它分配一定的系統資源。