java 異常指的是破壞原來正常程序運行指令的事件,分三種:
checkedExceptionruntime exceptionErrorcheckedException 受檢測異常是一中預期的能夠恢復的 ,比如:文件類型 打印機沒紙了。這些我們可以事先處理這種情況并提醒客戶,客戶可以重新選擇文件和加紙張就可以恢復了
runtime exception運行時異常,程序內部的錯誤的邏輯或者錯誤的使用API,一般是不可預期和恢復的,比如:空指針,數組越界等異常
Error 程序外包引起,比如內存,io等硬件,比如:內存異常 ,IOException
Error 可以看作是虛擬機錯誤 ,runtime exception運行時異樣看作是應用的錯誤 ,checkedException 受檢測異常看作是操作錯誤
異常使用過程中需要注意的幾點
只針對異常的情況才使用異常對可恢復的異常使用檢測異常 ,對于編程錯誤使用運行異常避免不必要地使用受檢的異常優先使用標準的異常拋出與抽象相對應的異常每個方法拋出的異常都要有文檔在細節消息中包含能捕獲失敗的信息努力使失敗保持原子性只針對異常的情況才使用異常,如:
//糟糕的代碼示例try{int i = 0;while(true)range[i++].climb();}catch(){}//標準模式for(Mountain m:range)m.climb();有開發者可能認為遍歷會進行檢測,為了提供效率故而采用第一種代碼方式,有三種錯誤 1.不符合異常機制設置的初衷 2.把代碼放在try-catch塊中 可能會阻止現代jvm本來可能會執行的優化 3.遍歷不會執行多余的檢測,已經執行優化
對可恢復的異常使用檢測異常 ,對于編程錯誤使用運行異常 如果期望調用的能夠適當的恢復,對于這種情況使用檢測異樣
避免不必要地使用受檢的異常 異常雖然能增加代碼的可靠性,但也會增加不方便,如果方法拋出一個或多個受檢測異常,那么調用方法就需要多個catch來處理這些,也算是一中負擔,如果一個方法只拋出單一的異常,可以考慮避免使用受檢異常。比如用if 檢測一下條件
優先使用標準的異常,api自帶一些常用的異常,我們可以復用這些異常,減少類的加載。
拋出與抽象相對應的異常,如果方法返回與處理業務無關的異常,這種情況將會使人不知所措,如果方法直接傳遞了低層的異常,不僅使人困惑,而且污染了高層API,為了避免這個問題,需要進行異常轉譯
//異常轉譯try{...//低層異常}catch(LowerException e){throw new HigherException();}每個方法拋出的異常都要有文檔, 是指方法拋出的異常需要注明什么情況會出現這種異常
在細節消息中包含能捕獲失敗的信息,包含能夠所有“對異常有貢獻的”參數和域的值,方便后續解決問題,這里的細節消息需要和用戶消息區分,細節消息是為了分析失敗原因
努力使失敗保持原子性,產生的任何異樣都應該讓對象保持在該方法調用之前的狀態,比如下面代碼 ,如果去掉檢測size ,試圖從一個空棧彈出元素,這時還是會拋出異常,然而,這將導致size域保持不一致負數的狀態。導致后面操作失敗 ,比如增加等。
public Object pop(){if(size==0){throw new EmptyStackException()}Object result = elements[--size]elements[size]=nullreturn result}新聞熱點
疑難解答