Error類對象由 Java 虛擬機生成並拋出,大多數錯誤與代碼編寫者所執行的操做無關。對於設計合理的應用程序來講,即便確實發生了錯誤,本質上也不該該試圖去處理它所引發的異常情況。java
在Exception分支中有一個重要的子類RuntimeException(運行時異常),這些異常是不檢查異常,程序中能夠選擇捕獲處理,也能夠不處理。這些異常通常是由程序邏輯錯誤引發的,程序應該從邏輯角度儘量避免這類異常的發生;而RuntimeException以外的異常咱們統稱爲非運行時異常,類型上屬於Exception類及其子類,從程序語法角度講是必須進行處理的異常,若是不處理,程序就不能編譯經過。程序員
注意 Error和Exception的區別:Error一般是災難性的致命的錯誤,是程序沒法控制和處理的,當出現這些異常時,Java虛擬機(JVM)通常會選擇終止線程;Exception一般狀況下是能夠被程序處理的,而且在程序中應該儘量的去處理這些異常。
♠提示 除了RuntimeException及其子類之外,其餘的Exception類及其子類都屬於檢查異常,當程序中可能出現這類異常,要麼使用try-catch語句進行捕獲,要麼用throws子句拋出,不然編譯沒法經過。
♠提示 對於運行時異常、錯誤和檢查異常,Java技術所要求的異常處理方式有所不一樣。 因爲運行時異常及其子類的不可查性,爲了更合理、更容易地實現應用程序,Java規定,運行時異常將由Java運行時系統自動拋出,容許應用程序忽略運行時異常。 對於方法運行中可能出現的Error,當運行方法不欲捕捉時,Java容許該方法不作任何拋出聲明。由於,大多數Error異常屬於永遠不能被容許發生的情況,也屬於合理的應用程序不應捕捉的異常。 對於全部的檢查異常,Java規定:一個方法必須捕捉,或者聲明拋出方法以外。也就是說,當一個方法選擇不捕捉檢查異常時,它必須聲明將拋出異常。
try{ //code that might generate exceptions }catch(Exception e){ //the code of handling exception1 }catch(Exception e){ //the code of handling exception2 } finally { }
一個例子:框架
public class Ex1 { public static void main(String[] args) { try{ System.out.println(Ex1.getResult()); }catch(Exception e){ e.printStackTrace(); System.out.println("截獲異常catch"); }finally{ System.out.println("異常處理finally"); } } public static int getResult() throws Exception{ int a =100; try{ a=a+10; throw new RuntimeException(); }catch(Exception e){ System.out.println("截獲異常並從新拋出異常"); throw new Exception(); }finally{ return a; } } }
輸出以下:編碼
截獲異常並從新拋出異常
110
異常處理finally線程
「截獲異常catch」卻沒有執行!
緣由是在getResult()的finally中return一個值,等同於告訴編譯器該方法沒有異常,但實際上異常是有的,這樣的結果是該方法的調用者卻捕獲不到異常,不要再finally中試圖return一個值,這樣可能會致使一些意想不到的邏輯錯誤,finally就是用來釋放資源的!設計
注意:在finally中改變返回值的作法是很差的,由於若是存在finally代碼塊,try中的return語句不會立馬返回調用者,而是記錄下返回值待finally代碼塊執行完畢以後再向調用者返回其值,而後若是在finally中修改了返回值,就會返回修改後的值。顯然,在finally中返回或者修改返回值會對程序形成很大的困擾,C#中直接用編譯錯誤的方式來阻止程序員幹這種齷齪的事情,Java中也能夠經過提高編譯器的語法檢查級別來產生警告或錯誤,Eclipse中能夠在如圖所示的地方進行設置,強烈建議將此項設置爲編譯錯誤。
Java的異常處理的知識點雜並且理解起來也有點困難,這裏給你們總結了如下幾點使用java異常處理的時候,良好的編碼習慣:code
一、處理運行時異常時,採用邏輯去合理規避同時輔助try-catch處理對象
二、在多重catch塊後面,能夠加一個catch(Exception)來處理可能會被遺漏的異常blog
三、對於不肯定的代碼,也能夠加上try-catch,處理潛在的異常繼承
四、儘可能去處理異常,切記只是簡單的調用printStackTrace()去打印
五、具體如何處理異常,要根據不一樣的業務需求和異常類型去決定
六、儘可能添加finally語句塊去釋放佔用的資源