天天看點

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

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

在項目中,我們會遇到異常處理,對于運作時異常,需要我們自己判斷處理。對于受檢異常,需要我們主動處理。

但是繁瑣的try{}catch嵌套在代碼裡,看着很不舒服,這裡我們不讨論性能,就代碼來講,來看看如何将他隐藏起來。原理是不變的。變得是寫法。下面我們來看如何優雅的處理異常塊。

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

行為參數化:

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

Lambda表達式:

java8提出:Lambda表達式了解為簡潔的表示可傳遞的匿名函數的一種方式,它沒有名稱,但它有函數體,參數清單,傳回類型。可以抛出一個異常類型。包裝代碼邏輯為參數即使用Lambda表達式。

函數式接口:

本質上是隻有一個抽象方法的普通接口,可以被隐式的轉換為Lambda表達式,需要用注解定義(@FunctionalInterface)。預設方法和靜态方法可以不屬于抽象方法,可以在函數式接口中定義。

如何優雅的實作 try catch 異常塊?
如果函數式接口中額外定義多個抽象方法,那麼這些抽象方法簽名必須和Object的public方法一樣,接口最終有确定的類實作, 而類的最終父類是Object。是以函數式接口可以定義Object的public方法。
如何優雅的實作 try catch 異常塊?

這句代碼想來小夥伴都不陌生。這是一個受檢異常,需要抛出一個ClassNotFoundException。

正常的寫法:

如何優雅的實作 try catch 異常塊?
如何優雅的實作 try catch 異常塊?
嗯,我們來看具體的實作:很簡單,我們要做的,即把`Class clazz = Class.forName("類名");`當做一種行為去處理,接受一個String ,得到一個Class,是以我們要定義一個函數接口,描述這種行為。
如何優雅的實作 try catch 異常塊?
這裡,因為我們的行為需要抛出異常。是以在接口裡也抛出異常。關于異常的最佳處理這裡不介紹了,詳細看下這篇《 Java 程式設計中關于異常處理的 10 個最佳實踐

》。

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

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

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

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

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

我的思路:

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

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

位元組流-》字元流-》字元緩存流 即 将位元組流轉換為字元流之後在用進階流包裝。

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

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

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

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

1.Java JVM、集合、多線程、新特性系列教程

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

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

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

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

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

繼續閱讀