1. 程式人生 > >JAVA項目中的常用的異常處理情況

JAVA項目中的常用的異常處理情況

有用 也會 index cas 類型 解決辦法 ces 責任 在外

在網上查閱了相關資料得出了以下JAVA項目中的常用的異常處理情況總結:

1、不要捕獲 Java 類庫中定義的繼承自 RuntimeException 的運行時異常類,如:IndexOutOfBoundsException / NullPointerException,這類異常由程序員預檢查違法來規避,保證程序健壯性。

2、異常不要用來做流程控制,條件控制,因為異常的處理效率比條件分支低。這個坑大家要註意了。

3、對大段代碼進行 try-catch,這是不負責任的表現。 catch 時請分清穩定代碼和非穩定代碼,穩定代碼指的是無論如何不會出錯的代碼。對於非穩定代碼的 catch 盡可能進行區分異常類型,再做對應的異常處理。

4、捕獲異常是為了處理它,不要捕獲了卻什麽都不處理而拋棄之,如果不想處理它,請將該異常拋給它的調用者。最外層的業務使用者,必須處理異常,將其轉化為用戶可以理解的內容。
5、有 try 塊放到了事務代碼中, catch 異常後,如果需要回滾事務,一定要註意手動回滾事務。

6、finally 塊必須對資源對象、流對象進行關閉,有異常也要做 try-catch。說明: 如果 JDK7,可以使用 try-with-resources 方式。
7、不能在 finally 塊中使用 return, finally 塊中的 return 返回後方法結束執行,不會再執行 try 塊中的 return 語句。

8、捕獲異常與拋異常,必須是完全匹配,或者捕獲異常是拋異常的父類。說明: 如果預期對方拋的是繡球,實際接到的是鉛球,就會產生意外情況。

9、方法的返回值可以為 null,不強制返回空集合,或者空對象等,必須添加註釋充分說明什麽情況下會返回 null 值。調用方需要進行 null 判斷防止 NPE 問題。
說明: 本規約明確防止 NPE 是調用者的責任。即使被調用方法返回空集合或者空對象,對調用者來說,也並非高枕無憂,必須考慮到遠程調用失敗,運行時異常等場景返回 null 的情況。

10、在代碼中使用“拋異常”還是“返回錯誤碼”,對於公司外的 http/api 開放接口必須使用“錯誤碼”; 而應用內部推薦異常拋出; 跨應用間 RPC 調用優先考慮使用 Result 方式,封裝 isSuccess、 “錯誤碼”、 “錯誤簡短信息”。

11、定義時區分 unchecked / checked 異常,避免直接使用 RuntimeException 拋出,更不允許拋出 Exception 或者 Throwable,應使用有業務含義的自定義異常。推薦業界已定義過的自定義異常,如: DAOException / ServiceException 等。
12、對於運行時異常,我們不要用try...catch來捕獲處理,而是在程序開發調試階段,盡量去避免這種異常,一旦發現該異常,正確的做法就會改進程序設計的代碼和實現方式,修改程序中的錯誤,從而避免這種異常。捕獲並處理運行時異常是好的解決辦法,因為可以通過改進代碼實現來避免該種異常的發生。對於受檢查異常,沒說的,老老實實去按照異常處理的方法去處理,要麽用try...catch捕獲並解決,要麽用throws拋出!對於Error(運行時錯誤),不需要在程序中做任何處理,出現問題後,應該在程序在外的地方找問題,然後解決。

程序運行時,發生的不被期望的事件,它阻止了程序按照程序員的預期正常執行,這就是異常。 在出現異常時,可能會出現錯誤提示詞為Throwable,Error, AWTError,IOError, LinkageErro,ThreadDeath,Exception,SQLException, IOException ,RuntimeException,IndexOutOfBoundsException,NullPointerException, ClassCastException。Throwable中包含有兩個重要的子類:Exception(異常)和 Error(錯誤),二者都是 Java 異常處理的重要子類,各自都包含大量子類。error表示系統或虛擬機的異常,無法捕獲,例如OutOfMemoryError。Exception表示 程序本身可以處理的異常。RuntimeException表示JVM 常用操作引發的異常。Checked表示在編譯期間就可以發現的異常,必須在運行之前就進行處理的異常,除了RuntimeException及其子類以外,其他的Exception類及其子類都屬於可查異常。這種異常的特點是Java編譯器會檢查它,也就是說,當程序中可能出現這類異常,要麽用try-catch語句捕獲它, 要麽用throws子句聲明拋出它,否則編譯不會通過。Unchecked表示包括運行時異常和錯誤。運行時異常表示運行時異常的特點是Java編譯器不會檢查它,也就是說,當程序中可能出現這類異常,即使沒有用try-catch語句捕獲它,也沒有用throws子句聲明拋出它,也會編譯通過。編譯異常表示是RuntimeException以外的異常,類型上都屬於Exception類及其子類。從程序語法角度講是必須進行處理的異常,如果不處理,程序就不能編譯通過。如IOException、SQLException等以及用戶自定義的Exception異常,一般情況下不自定義檢查異常。

異常是在執行某個函數時引發的,而函數又是層級調用,形成調用棧的,因為,只要一個函數發生了異常,那麽他的所有的caller都會被異常影響。當這些被影響的函數以異常信息輸出時,就形成的了異常追蹤棧。異常最先發生的地方,叫做異常拋出點。總體上我們根據Javac對異常的處理要求,將異常類分為2類。第一類時非檢查異常,Error 和 RuntimeException 以及他們的子類,對於這些異常,我們應該修正代碼,而不是去通過異常處理器處理 。這樣的異常發生的原因多半是代碼寫的有問題。第二類異常是,檢查異常,除了Error 和 RuntimeException的其它異常,這樣的異常一般是由程序的運行環境導致的。因為程序可能被運行在各種未知的環境下,而程序員無法幹預用戶如何使用他編寫的程序,於是程序員就應該為這樣的異常時刻準備著。以上就是我通過課上ppt以及百度了解到的有關異常的相關知識,出現異常的時候會出現的提示詞,以及異常的相關種類。

我們還需要掌握如何防止異常的出現,以及異常出現時該如何修復。Java提供了更加優秀的解決辦法:異常處理機制。異常處理機制能讓程序在異常發生時,按照代碼的預先設定的異常處理邏輯,針對性地處理異常,讓程序盡最大可能恢復正常並繼續執行,且保持代碼的清晰。Java中的異常可以是函數中的語句執行時引發的,也可以是程序員通過throw 語句手動拋出的,只要在Java程序中產生了異常,就會用一個對應類型的異常對象來封裝異常,JRE就會試圖尋找異常處理程序來處理異常。Throwable類是Java異常類型的頂層父類,一個對象只有是 Throwable 類的(直接或者間接)實例,他才是一個異常對象,才能被異常處理機制識別。JDK中內建了一些常用的異常類,我們也可以自定義異常。在編寫代碼處理異常時,對於檢查異常,有2種不同的處理方式:第一種是使用try…catch…finally語句塊處理它。在try語句塊中放可能出現異常的代碼,如果執行完try之後不發生異常,則執行finally塊和finally塊後面的代碼,如果發生異常,則嘗試匹配catch塊

JAVA項目中的常用的異常處理情況