1) Checked exception: 這類異常都是Exception的子類 。異常的向上拋出機制進行處理,若是子類可能產生A異常,那麼在父類中也必須throws A異常。可能致使的問題:代碼效率低,耦合度太高。C#中就沒有使用這種異常機制。
2) Unchecked exception: 這類異常都是RuntimeException的子類,雖然RuntimeException一樣也是Exception的子類,可是它們是特殊的,它們不能經過client code來試圖解決,因此稱爲Unchecked exception 。RuntimeException(運行時異常),不須要try...catch...或throws 機制去處理的異常。java
Java 提供了兩類主要的異常:runtimeException 和 checkedException;通常異常(checkedException)主要是指 IO 異常等。對於這種異常,JVM 要求咱們必須對其進行 cathc 處理,因此,面對這種異常,要寫一大堆的 catch 塊去處理可能出現的異常。運行時異常(runtimeException)(Unchecked exception)咱們通常不處理,當出現這類異常的時候程序會由虛擬機接管。好比,咱們歷來沒有去處理過 NullPointerException。多線程
出現運行時異常的時候,程序會將異常一直向上拋,一直拋到遇處處理代碼,若是沒有 catch 塊進行處理,到了最上層,若是是多線程就有 Thread.run()拋出,若是不是多線程 那麼就由main.run()
拋出。拋出以後,若是是線程,那麼該線程也就終止了,若是是主程序,那麼該程序也就終止了。其實運行時異常的也是繼承自 Exception,也能夠用 catch 塊對其處理,只是咱們通常不處理罷了,也就是說,若是不對運行時異常進行 catch 處理,那麼結果不是線程退出就是 主程序終止。若是不想終止,那麼咱們就必須捕獲全部可能出現的運行時異常。若是程序中出現了異常數據,可是它不影響下面的程序執行,那麼咱們就該在catch塊裏面將異常數據捨棄, 而後記錄日誌。若是,它影響到了下面的程序運行,那麼仍是程序退出比較好些。函數
在Java應用程序中,異常處理機制爲:拋出異常,捕捉異常。測試
拋出異常
:當一個方法出現錯誤引起異常時,方法建立異常對象並交付運行時系統,異常對象中包含了異常類型和異常出現時的程序狀態等異常信息。運行時系統負責尋找處置異常的代碼並執行。線程
捕獲異常
:在方法拋出異常以後,運行時系統將轉爲尋找合適的異常處理器(exception handler)。潛在的異常處理器是異常發生時依次存留在調用棧中的方法的集合。當異常處理器所能處理的異常類型與方法拋出的異常類型相符時,即爲合適的異常處理器。運行時系統從發生異常的方法開始,依次回查調用棧中的方法,直至找到含有合適異常處理器的方法並執行。當運行時系統遍歷調用棧而未找到合適的異常處理器,則運行時系統終止。同時,意味着Java程序的終止。日誌
任何 Java 代碼均可以拋出異常,如:本身編寫的代碼、來自 Java 開發環境包中代碼,或者 Java 運行時系統。不管是誰,均可以經過 Java 的 throw 語句拋出異常。從方法中拋出的任何異常都必須使用 throws
子句,捕捉異常經過 try-catch
語句或者 try-catch-finally
語句實現。code
Java經過面向對象的方式對異常進行處理,Java 把異常按照不一樣的類型進行分類,並提供了良好的接口。在 Java 中,每一個異常都是一個對象,它都是 Throwable 或其子類的實例。當一個方法出現異常後就會拋出一個異常對象,該對象中包含有異常信息,調用這個對象的方法能夠捕獲到這個異常並對異常進行處理。Java 的異常處理是經過5個 關鍵詞來實現的:try、catch、throw、throws、finally。對象
try
:用來指定一塊預防全部異常的程序catch
:緊跟在try後面,用來捕獲異常throw
:用來明確的拋出一個異常throws
:用來標明一個成員函數可能拋出的各類異常finally
:確保一段代碼不管發生什麼異常都會被執行的一段代碼。 當使用多個 catch 語句塊來捕獲異常時,須要將父類的 catch 語句塊放到子類型的 catch 塊以後,這樣才能保證後續的 catch 可能被執行,不然子類型的 catch 將永遠沒法到達,Java 編譯器會報編譯錯誤。若是 try 語句塊中存在 return 語句,那麼首先會執行 finally 語句塊中的代碼,而後才返回。若是 try 語句塊中存在 System.exit(0)
語句,那麼久不會執行 finally 語句塊的代碼了,由於 System.exit(0)
會終止當前運行的 JVM,程序在 JVM 終止前結束執行。blog
@Test public void testException2() { try { throw new Exception(); } catch (java.io.FileNotFoundException ex) { System.out.print("FileNotFoundException!"); } catch (java.io.IOException ex) { System.out.print("IOException!"); } catch (java.lang.Exception ex) { System.out.print("Exception!"); } } @Test public void testException1(){ /* try { int s = 12/0; System.out.print("TRY裏面"); }catch (Exception e){ e.printStackTrace(); } */ int s = 12/0; System.out.print("TRY外面"); }