來源:小明的學習筆記博客
地址: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流關閉,和例外捕獲,專心處理讀取邏輯即可,結合以下兩種技術:
-
+ try(){}【自動關閉流,1.7支持】
-
+ lambda特性來實作【行為引數化,1.8】

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

執行

加油,愿被這世界溫柔以待 _
推薦去我的博客閱讀更多:
1.Java JVM、集合、多執行緒、新特性系列教程
2.Spring MVC、Spring Boot、Spring Cloud 系列教程
3.Maven、Git、Eclipse、Intellij IDEA 系列工具教程
4.Java、后端、架構、阿里巴巴等大廠最新面試題
覺得不錯,別忘了點贊+轉發哦!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/27424.html
標籤:Java
