1. 程式人生 > >java異常解決機制:Exception

java異常解決機制:Exception

java中異常報錯如圖:

main:表示main方法執行緒;

java.util.InputMismatchException:表示列印當前異常型別;

下面為可能出錯行數,有些還有原因:by:***

java中提供了異常解決機制,幫助處理異常情況:

    異常解決辦法:

        第一種:try catch(try catch finally)

        異常解決結構:

try{
    //可能出現異常的程式碼段
}catch(匹配的異常){
    解決辦法//執行的程式碼段
}
 異常解決執行過程:
     1、先執行try塊,如果出現異常,匹配catch中的異常
     2、如果匹配到了,那麼執行catch塊中的內容
     3、catch中執行之後 程式繼續向下執行
     4、如果catch中匹配失敗了,那麼相當於程式沒有當前異常的解決手段,jvm會幫助我們解決該異常
 try-catch異常解決中的注意點:
     1、能夠捕獲的異常太少了,如果存在大量異常那麼還是jvm在解決
     2、catch塊中可以通過編寫父類 Exception 來捕獲try塊中的所有異常,但是處理方式過於單一,不推薦使用。
try{
    //可能出現異常的程式碼段
}catch(匹配的異常){
    解決辦法
    //執行的程式碼段
}catch(匹配的異常){
    解決辦法
    //執行的程式碼段
}catch(匹配的異常){
    解決辦法
    //執行的程式碼段
}

執行順序:
     1、執行try塊中的內容 如果有異常
     2、匹配下面所有catch塊 如果匹配到 執行對應catch中的 內容跳過整個try-catch,執行後續程式碼
     3、如果沒有對應的catch匹配, jvm處理該異常
 注意事項:
     1、一般情況下 我們會在多重catch中最後新增一個Exception,拍捕獲未知異常,統一處理
     2、Exception捕獲應該放到catch最後,因為異常會從第一個catch開始匹配,如果第一個是Exception,那麼會導致
          Exception捕獲所有異常,因為Exception是所有異常的父類

try{
    //可能出現異常的程式碼段
}catch(匹配的異常){
    解決辦法
    //執行的程式碼段
}catch(匹配的異常){
    解決辦法
    //執行的程式碼段
}catch(匹配的異常){
    解決辦法
    //執行的程式碼段
    。。。。。
}finally{
    //執行程式碼
}
執行順序
    1、執行try塊中的內容 如果有異常
    2、匹配下面所有catch塊 如果匹配到 執行對應catch中的 內容跳過整個try-catch,執行後續程式碼
    3、如果沒有對應的catch匹配, jvm處理該異常
    4、執行完整個try-catch 最後都會執行finally
 注意事項
    1、finally最後肯定會被執行
    2、return不能阻止finally執行  先執行finally再執行return
    3、如果要強制不執行finally,通過System.exit(0或者是一個非0的數); 0 代表正常退出  非0 非正常退出


        第二種:throws (throw)

            throws: 拋 出很多
  丟擲異常,不解決。 解決異常的一種方式,聽天由命 統一交由jvm解決
 在方法的形參列表之後 通過 throws 對外丟擲異常,這個異常可以是一個 也可以很多。
  throws 丟擲執行時異常時  呼叫該方法是 可以不對丟擲的異常進行處理,因為執行時異常只有程式執行期間才能捕獲
  
  在方法後新增throws關鍵詞 用來向上丟擲異常資訊:
  執行時異常:
  呼叫異常方法時 不會報錯 ,所以很難判定是否存在異常。
  檢查時異常:
  程式呼叫時會報錯:
  解決方案:
  1、繼續向上拋       簡單  但是不能解決問題

  2、手動try-catch   複雜 但是使用者體驗度好 能精準定位到問題出錯的地方

               throw:

                    定義在方法裡面 和throws一起使用

                    不要將throw產生的異常  try-catch

        很多時候。jdk提供的異常都不滿足場景需要,所以需要自己建立一個自定義異常:

            自定義異常:

                1、讓當前類繼承 Exception

                2、編寫空構造器以及帶參構造 
  顯示的呼叫父類中的空構造和帶參構造

程式異常:所有的異常類都是java.lang.Exception的子類;

       java.util.InputMismatchException:由Scanner丟擲,表明獲取的標記與期望型別的模式不相匹配,或者該標記超出期望型別的範圍。

        java.lang.IllegalStateExceptiom:在非法或不適當的時間呼叫方法時產生的訊號。換句話說,即 Java 環境或 Java 應用程式沒有處於請求操作所要求的適當狀態下。

        java.lang.ArithmeticException:當出現異常的運算條件時,丟擲此異常。例如,一個整數“除以零”時,丟擲此類的一個例項。

        java.lang.NullPointerException:當應用程式試圖在需要物件的地方使用 null 時,丟擲該異常。這種情況包括:      

            呼叫 null 物件的例項方法。

            訪問或修改 null 物件的欄位。

            將 null 作為一個數組,獲得其長度。    

            將 null 作為一個數組,訪問或修改其時間片。    

            將 null 作為 Throwable 值丟擲。 

        java.lang.ClassCastException:當試圖將物件強制轉換為不是例項的子類時,丟擲該異常。例如,以下程式碼將生成一個 ClassCastException

Object x = new Integer(0);
System.out.println((String)x);