泰山版Java開發手冊
《Java開發手冊》始于阿裡内部規約,在全球 Java 開發者共同努力下,已成為業界普遍遵循的開發規範。今年是手冊上線第四年,推出全新泰山版免費下載下傳,涵蓋三大更新亮點,直接下載下傳一睹為快:
Java七天學習訓練營Day5
Java七天學習訓練營是由泰山版《Java開發手冊》的作者親自出題,每天學習一個知識點,寫一份小作業,幫助你不僅是閱讀,更能透徹了解泰山版《Java開發手冊》的重要知識。
活動時間:5月15日截止送出完成打卡的同學名單
完成七天打卡挑戰的少俠即有機會獲得精美的阿裡雲開發者社群周邊禮品,包含阿裡雲ET公仔、超大社群滑鼠墊、衛衣、背包等等。
提示:每天需要從 進入,按照下方圖示點選才算打卡成功哦!

獎品說明:
同學們擷取獎品的順序,以阿裡妹收到同學完成打卡後填寫的表單序号為主。
第1名和第100、200、300等100的倍數打卡的同學送一個阿裡雲ET公仔(限量10個)
第10、20、30名等10的倍數打卡的同學送一張超大滑鼠墊(限量50個)
第6名、第66名、第666名(以此類推)打卡同學送一個阿裡雲雙肩包
第8名、第88名、第888名(以此類推)打卡的同學送一件阿裡雲定制衛衣
第1000名打卡的同學送上一個機械鍵盤!
除此之外,打卡完成編号是質數的同學可以獲得一份筆記本+貼紙的紀念品(限量30份)
(部分獎品展示)
阿裡雲ET公仔
超大開發者社群滑鼠墊
阿裡雲定制雙肩包
今日學習内容:異常處理
閱讀前需了解:
1.每日學習的知識點都節選自泰山版《Java開發手冊》,如想完整閱讀電子書的所有内容,請到專題頁下載下傳。
2.根據限制力強弱,規約依次分為強制、推薦、參考三大類:
【強制】必須遵守。是不得不遵守的約定,違反本約定或将會引起嚴重的後果。
【推薦】盡量遵守。長期遵守這樣的規定,有助于系統穩定性和合作效率的提升。
【參考】充分了解。技術意識的引導,是個人學習、團隊溝通、項目合作的方向。
1. 【強制】Java 類庫中定義的可以通過預檢查方式規避的RuntimeException異常不應該通過catch 的方式來處理,比如:NullPointerException,IndexOutOfBoundsException等等。
說明:無法通過預檢查的異常除外,比如,在解析字元串形式的數字時,可能數字格式錯誤,不得不通過catch NumberFormatException來實作。
正例:if (obj != null) {...}
反例:try { obj.method() } catch (NullPointerException e) {…}
2. 【強制】異常不要用來做流程控制,條件控制。
說明:異常設計的初衷是解決程式運作中的各種意外情況,且異常的處理效率比條件判斷方式要低很多。
3. 【強制】catch時請厘清穩定代碼和非穩定代碼,穩定代碼指的是無論如何不會出錯的代碼。對于非穩定代碼的catch盡可能進行區分異常類型,再做對應的異常處理。
說明:對大段代碼進行try-catch,使程式無法根據不同的異常做出正确的應激反應,也不利于定位問題,這是一種不負責任的表現。
正例:使用者注冊的場景中,如果使用者輸入非法字元,或使用者名稱已存在,或輸入密碼過于簡單,在程式上作出分門别類的判斷,并提示給使用者。
4. 【強制】捕獲異常是為了處理它,不要捕獲了卻什麼都不處理而抛棄之,如果不想處理它,請将該異常抛給它的調用者。最外層的業務使用者,必須處理異常,将其轉化為使用者可以了解的内容。
5. 【強制】事務場景中,抛出異常被catch後,如果需要復原,一定要手動復原事務。
6. 【強制】finally塊必須對資源對象、流對象進行關閉,有異常也要做try-catch。
說明:如果JDK7,可以使用try-with-resources方式。
7. 【強制】不要在finally塊中使用return。
說明:try塊中的return語句執行成功後,并不馬上傳回,而是繼續執行finally塊中的語句,如果此處存在return語句,則在此直接傳回,無情丢棄掉try塊中的傳回點。
反例:
private int x = 0;
public int checkReturn() {
try {
// x等于1,此處不傳回
return ++x;
} finally {
// 傳回的結果是2
return ++x;
}
}
8. 【強制】捕獲異常與抛異常,必須是完全比對,或者捕獲異常是抛異常的父類。
說明:如果預期對方抛的是繡球,實際接到的是鉛球,就會産生意外情況。
9. 【強制】在調用RPC、二方包、或動态生成類的相關方法時,捕捉異常必須使用Throwable類來進行攔截。
說明:通過反射機制來調用方法,如果找不到方法,抛出NoSuchMethodException。什麼情況會抛出NoSuchMethodError呢?二方包在類沖突時,仲裁機制可能導緻引入非預期的版本使類的方法簽名不比對,或者在位元組碼修改架構(比如:ASM)動态建立或修改類時,修改了相應的方法簽名。這些情況,即使代碼編譯期是正确的,但在代碼運作期時,會抛出NoSuchMethodError。
反例:某平台在退票費計算錯誤的故障中,由于fastvalidator引入了高版本的spring,導緻運作到某段核心邏輯時,抛出NoSuchMethodError錯誤,catch的卻是Exception,堆棧向上抛,影響到上層業務。這是一個非核心功能點影響到核心應用的典型反例。
10. 【推薦】方法的傳回值可以為null,不強制傳回空集合,或者空對象等,必須添加注釋充分說明什麼情況下會傳回null值。
說明:本規約明确防止NPE是調用者的責任。即使被調用方法傳回空集合或者空對象,對調用者來說,也并非高枕無憂,必須考慮到遠端調用失敗,運作時異常等場景傳回null的情況。
今日作業
關于故障,以下說法正确的是哪項?其他說法錯在哪裡?
a)在日常營運中,無論什麼原因導緻我們服務中斷、服務品質下降或使用者服務體驗下降的現象,稱為故障,但不包括使用者方環境或自身操作引起的問題
b)故障進行中一定要先優先止血
c)故障進行中處理人知道處理進展,沒時間同步相關方可以不同步
d)故障actions隻要完成就可以,是否驗收不通過處理人不需要關心
同學們請把作業寫在評論區裡,如果出現了優秀作業,将再給該同學送出額外的禮品!明天的打卡頁将公布答案。
上期答案
描述不正确的是c,TreeMap的key不允許為null,因為key要參與排序,當為null時,在底層調用compareTo方法進行比較排序時,就會報NullPointerException異常且TreeMap是非線程安全的。
點選下方圖檔回到Java開發手冊專題頁阿裡妹溫馨提示:恭喜你完成了第五天的學習打卡!建議收藏專題頁,每天記得上線打卡哦。隻有連續七天堅持打卡,才有機會領取到獎品!