Java 異常概括總結

1.異常的分類

  1) Checked exception: 這類異常都是Exception的子類 。異常的向上拋出機制進行處理,若是子類可能產生A異常,那麼在父類中也必須throws A異常。可能致使的問題:代碼效率低,耦合度太高。C#中就沒有使用這種異常機制。
  2) Unchecked exception: 這類異常都是RuntimeException的子類,雖然RuntimeException一樣也是Exception的子類,可是它們是特殊的,它們不能經過client code來試圖解決,因此稱爲Unchecked exception 。RuntimeException(運行時異常),不須要try...catch...或throws 機制去處理的異常。java

1.2Java異常

Java 提供了兩類主要的異常:runtimeException 和 checkedException;通常異常(checkedException)主要是指 IO 異常等。對於這種異常,JVM 要求咱們必須對其進行 cathc 處理,因此,面對這種異常,要寫一大堆的 catch 塊去處理可能出現的異常。運行時異常(runtimeException)(Unchecked exception)咱們通常不處理,當出現這類異常的時候程序會由虛擬機接管。好比,咱們歷來沒有去處理過 NullPointerException。多線程

1.3Java異常處理

  出現運行時異常的時候,程序會將異常一直向上拋,一直拋到遇處處理代碼,若是沒有 catch 塊進行處理,到了最上層,若是是多線程就有 Thread.run()拋出,若是不是多線程 那麼就由main.run() 拋出。拋出以後,若是是線程,那麼該線程也就終止了,若是是主程序,那麼該程序也就終止了。其實運行時異常的也是繼承自 Exception,也能夠用 catch 塊對其處理,只是咱們通常不處理罷了,也就是說,若是不對運行時異常進行 catch 處理,那麼結果不是線程退出就是 主程序終止。若是不想終止,那麼咱們就必須捕獲全部可能出現的運行時異常。若是程序中出現了異常數據,可是它不影響下面的程序執行,那麼咱們就該在catch塊裏面將異常數據捨棄, 而後記錄日誌。若是,它影響到了下面的程序運行,那麼仍是程序退出比較好些。函數

 

2.Java異常的繼承結構(網上借鑑)

3.Java檢查性異常捕獲

3.1java異常處理機制

在Java應用程序中,異常處理機制爲:拋出異常,捕捉異常。測試

  • 拋出異常:當一個方法出現錯誤引起異常時,方法建立異常對象並交付運行時系統,異常對象中包含了異常類型和異常出現時的程序狀態等異常信息。運行時系統負責尋找處置異常的代碼並執行。線程

  • 捕獲異常:在方法拋出異常以後,運行時系統將轉爲尋找合適的異常處理器(exception handler)。潛在的異常處理器是異常發生時依次存留在調用棧中的方法的集合。當異常處理器所能處理的異常類型與方法拋出的異常類型相符時,即爲合適的異常處理器。運行時系統從發生異常的方法開始,依次回查調用棧中的方法,直至找到含有合適異常處理器的方法並執行。當運行時系統遍歷調用棧而未找到合適的異常處理器,則運行時系統終止。同時,意味着Java程序的終止。日誌

任何 Java 代碼均可以拋出異常,如:本身編寫的代碼、來自 Java 開發環境包中代碼,或者 Java 運行時系統。不管是誰,均可以經過 Java 的 throw 語句拋出異常。從方法中拋出的任何異常都必須使用 throws 子句,捕捉異常經過 try-catch 語句或者 try-catch-finally 語句實現。code

3.2關鍵字說明

Java經過面向對象的方式對異常進行處理,Java 把異常按照不一樣的類型進行分類,並提供了良好的接口。在 Java 中,每一個異常都是一個對象,它都是 Throwable 或其子類的實例。當一個方法出現異常後就會拋出一個異常對象,該對象中包含有異常信息,調用這個對象的方法能夠捕獲到這個異常並對異常進行處理。Java 的異常處理是經過5個 關鍵詞來實現的:try、catch、throw、throws、finally。對象

  • try:用來指定一塊預防全部異常的程序
  • catch:緊跟在try後面,用來捕獲異常
  • throw:用來明確的拋出一個異常
  • throws:用來標明一個成員函數可能拋出的各類異常finally:確保一段代碼不管發生什麼異常都會被執行的一段代碼。

4.Java異常的其餘說明

  當使用多個 catch 語句塊來捕獲異常時,須要將父類的 catch 語句塊放到子類型的 catch 塊以後,這樣才能保證後續的 catch 可能被執行,不然子類型的 catch 將永遠沒法到達,Java 編譯器會報編譯錯誤。若是 try 語句塊中存在 return 語句,那麼首先會執行 finally 語句塊中的代碼,而後才返回。若是 try 語句塊中存在 System.exit(0) 語句,那麼久不會執行 finally 語句塊的代碼了,由於 System.exit(0)會終止當前運行的 JVM,程序在 JVM 終止前結束執行。blog

4.1測試代碼

 @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外面");
    }
相關文章
相關標籤/搜索