1. 【強制】Java 類庫中定義的一類RuntimeException可以通過預先檢查進行規避,而不應該通過catch 來處理,比如:IndexOutOfBoundsException,NullPointerException等等。說明:無法通過預檢查的異常除外,如在解析一個外部傳來的字符串形式數字時,通過catch
NumberFormatException來實現。
正例:if (obj != null) {...}
反例:try { obj.method() } catch (NullPointerException e) {...}
1. 【強制】異常不要用來做流程控制,條件控制,因為異常的處理效率比條件分支低。
2. 【強制】對大段代碼進行try-catch,這是不負責任的表現。catch時請分清穩定代碼和非穩定代碼,穩定代碼指的是無論如何不會出錯的代碼。對于非穩定代碼的catch盡可能進行區分異常類型,再做對應的異常處理。
3. 【強制】捕獲異常是為了處理它,不要捕獲了卻什么都不處理而拋棄之,如果不想處理它,請將該異常拋給它的調用者。最外層的業務使用者,必須處理異常,將其轉化為用戶可以理解的內容。
4. 【強制】有try塊放到了事務代碼中,catch異常后,如果需要回滾事務,一定要注意手動回滾事務。
5. 【強制】finally塊必須對資源對象、流對象進行關閉,有異常也要做try-catch。
說明:如果JDK7及以上,可以使用try-with-resources方式。
1. 【強制】不能在finally塊中使用return,finally塊中的return返回后方法結束執行,不會再執行try塊中的return語句。
2. 【強制】捕獲異常與拋異常,必須是完全匹配,或者捕獲異常是拋異常的父類。
說明:如果預期對方拋的是繡球,實際接到的是鉛球,就會產生意外情況。
1. 【推薦】方法的返回值可以為null,不強制返回空集合,或者空對象等,必須添加注釋充分
說明什么情況下會返回null值。調用方需要進行null判斷防止NPE問題。
說明:本手冊明確防止NPE是調用者的責任。即使被調用方法返回空集合或者空對象,對調用
者來說,也并非高枕無憂,必須考慮到遠程調用失敗、序列化失敗、運行時異常等場景返回 null的情況。
1. 【推薦】防止NPE,是程序員的基本修養,注意NPE產生的場景:
1) 返回類型為基本數據類型,return 包裝數據類型的對象時,自動拆箱有可能產生 NPE。
反例:public int f() { return Integer對象}, 如果為null,自動解箱拋NPE。
2) 數據庫的查詢結果可能為null。
3) 集合里的元素即使isNotEmpty,取出的數據元素也可能為null。
4) 遠程調用返回對象時,一律要求進行空指針判斷,防止NPE。
5) 對于Session中獲取的數據,建議NPE檢查,避免空指針。
6) 級聯調用obj.getA().getB().getC();一連串調用,易產生NPE。
正例:使用JDK8的Optional類來防止NPE問題。
1. 【推薦】定義時區分unchecked / checked 異常,避免直接拋出new RuntimeException(),更不允許拋出Exception或者Throwable,應使用有業務含義的自定義異常。推薦業界已定義過的自定義異常,如:DAOException / ServiceException等。
2. 【參考】在代碼中使用“拋異常”還是“返回錯誤碼”,對于公司外的http/api開放接口必須使用“錯誤碼”;而應用內部推薦異常拋出;跨應用間RPC調用優先考慮使用Result方式,封裝isSuccess()方法、“錯誤碼”、“錯誤簡短信息”。
說明:關于RPC方法返回方式使用Result方式的理由:
1) 使用拋異常返回方式,調用方如果沒有捕獲到就會產生運行時錯誤。
2) 如果不加棧信息,只是new自定義異常,加入自己的理解的error message,對于調用端解決問題的幫助不會太多。如果加了棧信息,在頻繁調用出錯的情況下,數據序列化和傳輸的性能損耗也是問題。
1. 【參考】避免出現重復的代碼(Don’t Repeat Yourself),即DRY原則。
說明:隨意復制和粘貼代碼,必然會導致代碼的重復,在以后需要修改時,需要修改所有的副本,容易遺漏。必要時抽取共性方法,或者抽象公共類,甚至是組件化。
正例:一個類中有多個public方法,都需要進行數行相同的參數校驗操作,這個時候請抽取:
private boolean checkParam(DTO dto) {...}
- 一、編程規約????1
- (一) 命名風格????1
- (二) 常量定義????3
- (三) 代碼格式????4
- (四) OOP規約????6
- (五) 集合處理????9
- (六) 并發處理????12
- (七) 控制語句????14
- (八) 注釋規約????16
- (九) 其它????17
- 二、異常日志????18
- (一) 異常處理????18
- (二) 日志規約????19
- 三、單元測試????21
- 四、安全規約????23
- 五、MySQL數據庫????24
- (一) 建表規約????24
- (二) 索引規約????25
- (三) SQL語句????27
- (四) ORM映射????28
- 六、工程結構????30
- (一) 應用分層????30
- (二) 二方庫依賴????31
- (三) 服務器????32
- 附1:版本歷史????34
- 附2:本手冊專有名詞????35