java將異常分爲兩種,checked exception和unchecked exception(通常指runtimeException)。java
checked exception:不是調用者非法使用或傳入不正確參數形成的異常,運行時遇到此類異常須要調用者根據狀況做出反應,捕獲後程序能夠繼續運行,代碼中必須顯示捕獲,若是拋出此類異常也須要在函數名後顯示加入throws關鍵字數組
public static void checkedExceptionMaker() throws Exception{ throw new Exception("checkExceptionMaker exception"); }
unchecked exception:程序運行期間,因調用者不正確使用致使的異常發生,此時可使用運行時異常,並使得程序遇到此異常時,被終止,可能拋出unchecked exception的函數無需指定throws異常類型tcp
public static void runtimeExceptionMaker() { throw new RuntimeException("runtimeExceptionMaker exception"); }
checked exception須要顯示捕獲,不然會編譯出錯,而unchecked exception是可選地捕獲,萬一不捕獲就會沿函數棧(調用函數軌跡)往上拋出,最終終止程序。函數
1 public static void main(String[] argv) { 2 3 try { 4 checkedExceptionMaker(); 5 System.out.println("pass checked exception"); 6 } catch (Exception e) { 7 e.printStackTrace(); 8 } 9 System.out.println("program is still running..."); 10 runtimeExceptionMaker(); 11 12 System.out.println("program is done"); 13 14 }
運行結果:spa
java.lang.Exception: checkExceptionMaker exception at edu.xhyzjiji.cn.exception_demo.ExceptionClassify.checkedExceptionMaker(ExceptionClassify.java:26) at edu.xhyzjiji.cn.exception_demo.ExceptionClassify.main(ExceptionClassify.java:13) Exception in thread "main" java.lang.RuntimeException: runtimeExceptionMaker exception at edu.xhyzjiji.cn.exception_demo.ExceptionClassify.runtimeExceptionMaker(ExceptionClassify.java:30) at edu.xhyzjiji.cn.exception_demo.ExceptionClassify.main(ExceptionClassify.java:19) program is still running...
注意行5,12的代碼沒有被執行。code
/*何時用check exception,何時須要unchecked exception?*/blog
checked exception是對接口調用者(後面簡稱調用者)輸入參數可預知的異常進行檢查, 好比除數爲0,某些必要參數爲null,打開了不存在的文件之類,這些問題是由調用者引入,並不是接口源碼的漏洞,咱們就能夠大膽使用checked exception,以告知調用者可能存在的輸入問題,調用者以try-catch方式捕獲這些異常,並根據異常類型將程序引導到正常流程中去。繼承
unchecked exception多是接口自己問題而致使異常的出現,好比數組越界訪問,因端口號被佔用使得建立tcp客戶端失敗,這些異常可能存在如下特色:
1.接口源碼自己有問題;2.異常產生使後續程序沒法運行,這時候應該終止程序並讓接口開發者修改潛在問題,從新發布接口,這時候咱們能夠選用unchecked exception。接口
/*unchecked exception是否須要try-catch*/開發
有時候爲了程序不所以崩潰,須要對unchecked exception也進行try-catch,這依賴於對接口源碼必定的熟悉程度,可是因爲unchecked exception的發生,調用者沒法引導程序納入正常流程,因此即便try-catch捕獲到異常,後續的調用也會繼續拋出異常,try-catch的意義就不大了,並且會令咱們的代碼滿布try-catch代碼塊。
溫和的作法是咱們能夠選擇try-catch可能發生的unchecked exception,並重試數次或累計拋出次數,若是依然得不到解決,咱們本身再拋出一個runtime exception來結束當前的程序。