1. 程式人生 > 實用技巧 >如何優雅的實現 try catch 異常塊?

如何優雅的實現 try catch 異常塊?

來源:小明的學習筆記部落格

地址:www.cnblogs.com/liruilong/p/13403963.html

在專案中,我們會遇到異常處理,對於執行時異常,需要我們自己判斷處理。對於受檢異常,需要我們主動處理。

但是繁瑣的try{}catch巢狀在程式碼裡,看著很不舒服,這裡我們不討論效能,就程式碼來講,來看看如何將他隱藏起來。原理是不變的。變得是寫法。下面我們來看如何優雅的處理異常塊。

在這之前。你需要知道以下幾個概念:

  • 行為引數化:

  • 是java8提出的,函數語言程式設計的一種思想,通過把程式碼包裝為引數傳遞行為,即把程式碼邏輯包裝為一個引數,傳到方法裡,Java8系列新特性教程可以關注公眾號Java技術棧搜尋閱讀。

  • Lambda表示式:

  • java8提出:Lambda表示式理解為簡潔的表示可傳遞的匿名函式的一種方式,它沒有名稱,但它有函式體,引數列表,返回型別。可以丟擲一個異常型別。包裝程式碼邏輯為引數即使用Lambda表示式。

  • 函式式介面:

  • 本質上是隻有一個抽象方法的普通介面,可以被隱式的轉換為Lambda表示式,需要用註解定義(@FunctionalInterface)。預設方法和靜態方法可以不屬於抽象方法,可以在函式式介面中定義。

如果函式式介面中額外定義多個抽象方法,那麼這些抽象方法簽名必須和Object的public方法一樣,介面最終有確定的類實現, 而類的最終父類是Object。因此函式式介面可以定義Object的public方法。

這句程式碼想來小夥伴都不陌生。這是一個受檢異常,需要丟擲一個ClassNotFoundException。

正常的寫法:

嗯,我們來看具體的實現:很簡單,我們要做的,即把`Class<?> clazz = Class.forName("類名");`當做一種行為去處理,接受一個String ,得到一個Class,所以我們要定義一個函式介面,描述這種行為。

這裡,因為我們的行為需要丟擲異常。所以在接口裡也丟擲異常。關於異常的最佳處理這裡不介紹了,詳細看下這篇《Java 程式設計中關於異常處理的 10 個最佳實踐》。

然後,我們需要定義一個方法,將我們的行為作為引數傳進去,同時,捕獲一下我們的異常。

然後,我們可以呼叫我們的方法classFind方法,

當然。其實這種思想並不簡單的可以做捕獲異常的處理,

我們來看一個Demo->文字檔案轉換為字串:

在我看來;將文字檔案轉換為字串,我們需要使用高階流包裝低階流,然後做快取讀出來。這裡,我們不可避免的會遇到異常處理,流的關閉等操作,下面我們將這些程式碼都異常起來。專心寫讀的邏輯即可。

我的思路:

我對java IO用的不是很熟,大家有好的方法請留言,相互學習:

FileInputStream fileInputStream = new FileInputStream(file))

InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream))

BufferedReader bufferedReader = new BufferedReader(inputStreamReader))

String str = bufferedReader.readLine()

位元組流-》字元流-》字元快取流 即 將位元組流轉換為字元流之後在用高階流包裝。

所以我的思路是避免在邏輯裡出現太多的IO流關閉,和異常捕獲,專心處理讀取邏輯即可,結合以下兩種技術:

執一個行為,任何BufferReader -> String的Lambda表示式都可以作為引數傳入。只要符合peocess方法的簽名即可。

執行

加油,願被這世界溫柔以待 _

推薦去我的部落格閱讀更多:

1.Java JVM、集合、多執行緒、新特性系列教程

2.Spring MVC、Spring Boot、Spring Cloud 系列教程

3.Maven、Git、Eclipse、Intellij IDEA 系列工具教程

4.Java、後端、架構、阿里巴巴等大廠最新面試題

覺得不錯,別忘了點贊+轉發哦!