Java 集合處理/ 空值處理/ 異常處理,使用心得分享!

Java技術(shù)棧
www.javastack.cn
關(guān)注閱讀更多優(yōu)質(zhì)文章
1. Arrays.asList
業(yè)務(wù)開發(fā)當中,我們常常會將原始的數(shù)組轉(zhuǎn)換為List類數(shù)據(jù)結(jié)構(gòu),來繼續(xù)展開各種Stream操作
Arrays.asList無法轉(zhuǎn)換基本類型的數(shù)組,可以使用Arrays.stream來進行轉(zhuǎn)換 Arrays.asList返回的list是不支持增刪操作的,其返回的List是Arrays的內(nèi)部類ArrayList。內(nèi)部繼承自AbstractList,沒有覆寫父類的add方法 對原始數(shù)組的修改會影響到我們獲得的那個List
2. 空值處理
2.1 NullPointerException
可能出現(xiàn)的場景
參數(shù)值是Integer等包裝類型,使用時因為自動拆箱出現(xiàn)了空指針異常 字符串比較 ConcurrentHashMap這種容器不支持Key和Value為null,強行put null的key或Value會出現(xiàn)空指針異常 方法或遠程服務(wù)返回的list是null,沒做判空就直接調(diào)用,出現(xiàn)空指針異常 聯(lián)級調(diào)用的null check best practice
string.equalsTo(variableName)Optional.ofNullable()orElse()
3. 異常處理
3.1 在業(yè)務(wù)代碼層面考慮異常處理
大多數(shù)業(yè)務(wù)應用都采用三層架構(gòu) 負責數(shù)據(jù)訪問實現(xiàn),一般沒有業(yè)務(wù)邏輯 根據(jù)情況來做忽略,降級,或者轉(zhuǎn)化為一個友好的異常 負責核心業(yè)務(wù)邏輯,包括外部服務(wù)調(diào)用,訪問數(shù)據(jù)庫,緩存處理,消息處理等 一般會涉及到數(shù)據(jù)庫事務(wù),出現(xiàn)異常不適合捕獲,否則事務(wù)無法自動回滾 負責信息收集,參數(shù)校驗,轉(zhuǎn)換服務(wù)層處理的數(shù)據(jù)適配前端,輕業(yè)務(wù)邏輯 Controller 捕獲異常,然后需要給用戶友好用戶的提示 Controller層 Service層 Repository層 框架層面的異常處理 @RestControllerAdvice@ExceptionHandler盡量不要在框架層面做異常的自動,統(tǒng)一的處理 框架應當來做兜底工作,如果異常上升到最上層邏輯還是無法處理的話,可以用統(tǒng)一的方式進行異常轉(zhuǎn)換
3.2 不要直接生吞異常
捕獲了異常以后不應該生吞,因為吞掉的異常如果沒有正常處理的話,出現(xiàn)Bug會很難發(fā)現(xiàn)。
需要有合適的轉(zhuǎn)化成用戶友好的異常,或者至少在warn, error級別來做log。
推薦閱讀:10 個深惡痛絕的 Java 異常。
3.3 保留原始的信息
在捕捉了異常之后,一定要記得在log 或者在向外扔出的異常之中記錄原始異常信息
catch?(IOException?e)?{
????//只保留了異常消息,棧沒有記錄
????log.error("文件讀取錯誤,?{}",?e.getMessage());
????throw?new?RuntimeException("系統(tǒng)忙請稍后再試");
}
catch?(IOException?e)?{
????throw?new?RuntimeException("系統(tǒng)忙請稍后再試",?e);
}
另外,關(guān)注公眾號Java技術(shù)棧,在后臺回復:面試,可以獲取我整理的 Java 系列面試題和答案,非常齊全。
3.4 小心finally中的異常 + try with resources
注意在資源釋放處理等收尾操作的時候也可能會出現(xiàn)異常,這種時候,如果try block邏輯和finnally邏輯都有異常拋出的話,try當中的異常會被finnally中的異常覆蓋掉,這會讓問題變得非常不明顯。
推薦閱讀:你還在使用 try-catch-finally 關(guān)閉資源?
@GetMapping("wrong")
public?void?wrong()?{
????try?{
????????log.info("try");
????????//異常丟失
????????throw?new?RuntimeException("try");
????}?finally?{
????????log.info("finally");
????????throw?new?RuntimeException("finally");
????}
}
對于實現(xiàn)了AutoCloseable接口的資源,可以使用try-with-resources來釋放資源,就是在try中帶資源的聲明。
try catch finally vs try with resources
Scanner?scanner?=?null;
try?{
????scanner?=?new?Scanner(new?File("test.txt"));
????while?(scanner.hasNext())?{
????????System.out.println(scanner.nextLine());
????}
}?catch?(FileNotFoundException?e)?{
????e.printStackTrace();
}?finally?{
????if?(scanner?!=?null)?{
????????scanner.close();
????}
}
try?(Scanner?scanner?=?new?Scanner(new?File("test.txt")))?{
????while?(scanner.hasNext())?{
????????System.out.println(scanner.nextLine());
????}
}?catch?(FileNotFoundException?fnfe)?{
????fnfe.printStackTrace();
}
3.5 線程池任務(wù)的異常處理
設(shè)置自定義的異常處理程序作為保底,比如在聲明線程池時自定義線程池的未捕獲異常處理程序:
new?ThreadFactoryBuilder()
??.setNameFormat(prefix+"%d")
??.setUncaughtExceptionHandler((thread,?throwable)->?log.error("ThreadPool?{}?got?exception",?thread,?throwable))
??.get()
最后,關(guān)注公眾號Java技術(shù)棧,在后臺回復:面試,可以獲取我整理的 Java 系列面試題和答案,非常齊全。
Reference
https://www.baeldung.com/java-try-with-resources https://time.geekbang.org/column/article/220230






關(guān)注Java技術(shù)??锤喔韶?/strong>


