try{}catch的隱藏(如何優雅的實現異常塊)
在項目中,我們會遇到異常處理,對於運行時異常,需要我們自己判斷處理。對於受檢異常,需要我們主動處理。
但是繁瑣的try{}caht嵌套在程式碼里,看著很不舒服,這裡我們不討論性能,就程式碼來講,來看看如何將他隱藏起來。原理是不變的。變得是寫法。下面我們來看如何優雅的處理異常塊。
在這之前。你需要知道以下幾個概念:
- 行為參數化:
- 是java8提出的,函數式編程的一種思想,通過把程式碼包裝為參數傳遞行為,即把程式碼邏輯包裝為一個參數,傳到方法里。
- Lambda表達式:
- java8提出:Lambda表達式理解為簡潔的表示可傳遞的匿名函數的一種方式,它沒有名稱,但它有函數體,參數列表,返回類型。可以拋出一個異常類型。包裝程式碼邏輯為參數即使用Lambda表達式。
- 函數式介面:
- 本質上是只有一個抽象方法的普通介面,可以被隱式的轉換為Lambda表達式,需要用註解定義(@FunctionalInterface)。默認方法和靜態方法可以不屬於抽象方法,可以在函數式介面中定義。
如果函數式介面中額外定義多個抽象方法,那麼這些抽象方法簽名必須和Object的public方法一樣,介面最終有確定的類實現, 而類的最終父類是Object。 因此函數式介面可以定義Object的public方法。
這句程式碼想來小夥伴都不陌生。這是一個受檢異常,需要拋出一個ClassNotFoundException。
正常的寫法:
嗯,我們來看具體的實現:很簡單,我們要做的,即把`Class<?> clazz = Class.forName(“類名”);`當做一種行為去處理,接受一個String ,得到一個Class,所以我們要定義一個函數介面,描述這種行為。
這裡,因為我們的行為需要拋出異常。所以在介面里也拋出異常。
然後,我們需要定義一個方法,將我們的行為作為參數傳進去,同時,捕獲一下我們的異常。
然後,我們可以調用我們的方法classFind方法,
當然。其實這種思想並不簡單的可以做捕獲異常的處理,
我們來看一個Demo->文本文件轉換為字元串:
在我看來;將文本文件轉換為字元串,我們需要使用高級流包裝低級流,然後做快取讀出來。這裡,我們不可避免的會遇到異常處理,流的關閉等操作,下面我們將這些程式碼都異常起來。專心寫讀的邏輯即可。
我的思路:
我對java IO用的不是很熟,大家有好的方法請留言,相互學習:
FileInputStream fileInputStream = new FileInputStream(file))
InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream))
BufferedReader bufferedReader = new BufferedReader(inputStreamReader))
String str = bufferedReader.readLine()
位元組流-》字元流-》字元快取流 即 將位元組流轉換為字元流之後在用高級流包裝。
所以我的思路是避免在邏輯里出現太多的IO流關閉,和異常捕獲,專心處理讀取邏輯即可,結合以下兩種技術:
- + try(){}【自動關閉流,1.7支援】
- + lambda特性來實現【行為參數化,1.8】
執一個行為,任何BufferReader -> String的Lambda表達式都可以作為參數傳入。只要符合peocess方法的簽名即可。
執行