1. 程式人生 > 實用技巧 >JavaSE部分 (異常)

JavaSE部分 (異常)

寫在前面:分享技術,共同進步,把寫的筆記搬運至部落格,有不足請見諒,相關意見可評論告知 ╰( ̄ω ̄o)

程式設計路漫漫,學習無止盡!

目錄

異常概述

  • 異常 :指的是程式在執行過程中,出現的非正常的情況,最終會導致JVM的非正常停止。

在Java等面向物件的程式語言中,異常本身是一個類,產生異常就是建立異常物件並丟擲了一個異常物件。Java處理異常的方式是中斷處理。

異常指的並不是語法錯誤,語法錯了,編譯不通過,不會產生位元組碼檔案,根本不能執行.

java.lang.Throwable:類是 Java 語言中所有錯誤或異常的超類。
Exception:編譯期異常,進行編譯(寫程式碼)java程式出現的問題
RuntimeException:執行期異常,java程式執行過程中出現的問題

異常體系

Exception部分

ctrl + alt + T 異常相關操作
雙擊 shift 搜尋

Objects非空判斷

之前學習的類Objects,它由一些靜態的實用方法組成,這些方法是null-save(空指標安全的)或null-tolerant(容忍空指標的)在它的原始碼中,對物件為null的值進行了丟擲異常操作。

  • public static <T> T requireNonNull(T obj)
    :檢視指定引用物件不是null。

檢視原始碼發現這裡對為null的進行了丟擲異常操作:

public static <T> T requireNonNull(T obj) {
    if (obj == null)
      	throw new NullPointerException();
    return obj;
}

宣告異常throws

宣告異常:將問題標識出來,報告給呼叫者。如果方法內通過throw丟擲了編譯時異常,而沒有捕獲處理(稍後講解該方式),那麼必須通過throws進行宣告,讓呼叫者去處理。

關鍵字throws運用於方法宣告之上,用於表示當前方法不處理異常,而是提醒該方法的呼叫者來處理異常(丟擲異常).

注意:
1.throws關鍵字必須寫在方法宣告處
2.throws關鍵字後邊宣告的異常必須是Exception或者是Exception的子類
3.方法內部如果丟擲了多個異常物件,那麼throws後邊必須也宣告多個異常
如果丟擲的多個異常物件有子父類關係,那麼直接宣告父類異常即可
4.呼叫了一個宣告丟擲異常的方法,我們就必須的處理宣告的異常
要麼繼續使用throws宣告丟擲,交給方法的呼叫者處理,最終交給JVM
要麼try...catch自己處理異常
宣告異常格式:

修飾符 返回值型別 方法名(引數) throws 異常類名1,異常類名2…{   }	

宣告異常的程式碼演示:

public class ThrowsDemo {
    public static void main(String[] args) throws FileNotFoundException {
        read("a.txt");
    }

    // 如果定義功能時有問題發生需要報告給呼叫者。可以通過在方法上使用throws關鍵字進行宣告
    public static void read(String path) throws FileNotFoundException {
        if (!path.equals("a.txt")) {//如果不是 a.txt這個檔案 
            // 我假設  如果不是 a.txt 認為 該檔案不存在 是一個錯誤 也就是異常  throw
            throw new FileNotFoundException("檔案不存在");
        }
    }
}

throws用於進行異常類的宣告,若該方法可能有多種異常情況產生,那麼在throws後面可以寫多個異常類,用逗號隔開。

public class ThrowsDemo2 {
    public static void main(String[] args) throws IOException {
        read("a.txt");
    }

    public static void read(String path)throws FileNotFoundException, IOException {
        if (!path.equals("a.txt")) {//如果不是 a.txt這個檔案 
            // 我假設  如果不是 a.txt 認為 該檔案不存在 是一個錯誤 也就是異常  throw
            throw new FileNotFoundException("檔案不存在");
        }
        if (!path.equals("b.txt")) {
            throw new IOException();
        }
    }
}

捕獲異常try…catch

ctrl + alt + T 異常相關操作

如果異常出現的話,會立刻終止程式,所以我們得處理異常:

  1. 該方法不處理,而是宣告丟擲,由該方法的呼叫者來處理(throws)。
  2. 在方法中使用try-catch的語句塊來處理異常。

try-catch的方式就是捕獲異常。

  • 捕獲異常:Java中對異常有針對性的語句進行捕獲,可以對出現的異常進行指定方式的處理。

捕獲異常語法如下:

try{
     編寫可能會出現異常的程式碼
}catch(異常型別  e){
     處理異常的程式碼
     //記錄日誌/列印異常資訊/繼續丟擲異常
}

也可以類似於if else 巢狀使用

注意:try和catch都不能單獨使用,必須連用。

演示如下:

public class TryCatchDemo {
    public static void main(String[] args) {
        try {// 當產生異常時,必須有處理方式。要麼捕獲,要麼宣告。
            read("b.txt");
        } catch (FileNotFoundException e) {// 括號中需要定義什麼呢?
          	//try中丟擲的是什麼異常,在括號中就定義什麼異常型別
            System.out.println(e);
        }
        System.out.println("over");
    }
    /*
     *
     * 我們 當前的這個方法中 有異常  有編譯期異常
     */
    public static void read(String path) throws FileNotFoundException {
        if (!path.equals("a.txt")) {//如果不是 a.txt這個檔案 
            // 我假設  如果不是 a.txt 認為 該檔案不存在 是一個錯誤 也就是異常  throw
            throw new FileNotFoundException("檔案不存在");
        }
    }
}

Throwable

Throwable類中定義了一些檢視方法:

  • public String getMessage():獲取異常的描述資訊,原因(提示給使用者的時候,就提示錯誤原因。

  • public String toString():獲取異常的型別和異常描述資訊(不用)。

  • public void printStackTrace():列印異常的跟蹤棧資訊並輸出到控制檯。(列印JVM異常物件其異常資訊是最全面的)

包含了異常的型別,異常的原因,還包括異常出現的位置,在開發和除錯階段,都得使用printStackTrace。

finally 程式碼塊

finally:,在finally程式碼塊中存放的程式碼都是一定會被執行的。

當我們在try語句塊中打開了一些物理資源(磁碟檔案/網路連線/資料庫連線等),我們都得在使用完之後,最終關閉開啟的資源。

finally的語法:

try...catch....finally:自身需要處理異常,最終還得關閉資源。

注意:finally不能單獨使用。

finally程式碼參考如下:

public class TryCatchDemo4 {
    public static void main(String[] args) {
        try {
            read("a.txt");
        } catch (FileNotFoundException e) {
            //抓取到的是編譯期異常  丟擲去的是執行期 
            throw new RuntimeException(e);
        } finally {
            System.out.println("不管程式怎樣,這裡都將會被執行。");
        }
        System.out.println("over");
    }
    /*
     *
     * 我們 當前的這個方法中 有異常  有編譯期異常
     */
    public static void read(String path) throws FileNotFoundException {
        if (!path.equals("a.txt")) {//如果不是 a.txt這個檔案 
            // 我假設  如果不是 a.txt 認為 該檔案不存在 是一個錯誤 也就是異常  throw
            throw new FileNotFoundException("檔案不存在");
        }
    }
}

當只有在try或者catch中呼叫退出JVM的相關方法,此時finally才不會執行,否則finally永遠會執行。

異常注意事項

  1. 執行時異常被丟擲可以不處理。即不捕獲也不宣告丟擲。

  2. 如果finally有return語句,永遠返回finally中的結果,避免該情況.

  3. 如果父類丟擲了多個異常,子類重寫父類方法時,丟擲和父類相同的異常或者是父類異常的子類或者不丟擲異常。

  4. 父類方法沒有丟擲異常,子類重寫父類該方法時也不可丟擲異常。此時子類產生該異常,只能捕獲處理,不能宣告丟擲

寫在最後:全棧方向,前端已經大部分學完,將會以複習的形式出現在部落格,大家敬請期待哈~