Java中異常分類和Throw和Throws的區別

homeSicker發表於2020-05-25

1.異常分類

Throwable是Java中所有錯誤和異常的超類。它的下一級是Error和Exception

1.1 Error(錯誤)

Error是指程式執行時系統的內部錯誤和資源耗盡錯誤。程式不會丟擲該類物件。如果出現了Error,代表程式執行時JVM出現了重大問題,比如常見的OutOfMemoryError(OOM),這時應當告知使用者並儘量讓程式安全結束。

1.2 Exception(異常)

Exception是指程式可以自身處理的異常。Exception又分為檢查異常(CheckedException)和執行異常(RuntimeException):

  • CheckedException:檢查異常一般是外部錯誤,都傳送在編譯階段,是我們在編碼時應當可以預計會發生的異常情況,編譯器通常會提示我們去捕獲這些異常並進行處理。我們可以通過try-catch來捕獲或者throws語句來丟擲,否則編譯器會提示不通過。常見的有:FileNotFoundException,SQLException,ClassNotFoundException。
  • RuntimeException:執行異常一般是Java虛擬機器正常執行期間丟擲的異常的超類,程式中可以處理這些異常,也可以不處理這些異常,編譯器並不會提示我們來處理這些異常。但是這些異常通常都是編碼出現了錯誤導致的,我們應當儘量避免出現這些異常。常見的有:NullPointerException(空指標),IndexOutOfBoundsException(下標越界),ClassCastException(型別強制轉換異常)。

2.異常處理方法

在Java中,異常處理機制主要是:丟擲異常捕獲異常

2.1 丟擲異常

遇到異常不進行具體的處理,而是通過throw、throws繼續拋給呼叫者。這兩者有一定的區別:

  • 位置區別:throw用在函式體內,後面跟具體的異常物件, throws用在函式方法上,後面跟一個或者多個異常類
  • 功能區別: throw表示一定丟擲了某種特定異常物件,執行到throw後,會跳轉會呼叫者,並且呼叫者會接收到該異常,throws表示可能丟擲異常,並不一定會發生這些異常,呼叫者只是知道該方法可能出現的問題,可以預先給出處理方法
    throws多個異常

丟擲異常後都是讓呼叫者去接收並進行相關處理

2.2 捕獲異常

通過try-catch語句在catch中捕獲相關異常,並進行處理。try來捕獲其中程式碼的異常,catch負責處理具體的異常。

 try {
          BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(new File("test.txt")));
      } catch (FileNotFoundException e) {
          System.out.println("FileNotFoundException檔案未找到異常。");
      }

一旦try中捕獲的異常進行catch塊中,程式將不再執行try後面的語句,同時也不會再進入其他catch塊中,所以在多個catch塊中應該將更加底層的catch放在前面,當與finally同時使用時,catch塊中執行結束會進入finally中

public class ExceptionTest {
    public static void main(String[] args){
        try {
            System.out.println("try1");
            int i = 1/0;
            System.out.println("try2");
        }catch (ArithmeticException e){
            System.out.println("ArithmeticException");
        }catch (RuntimeException e){
            System.out.println("RuntimeException");
        }catch (Exception e){
            System.out.println("Exception");
        }finally {
            System.out.println("finally");
        }
    }
}

執行結果:

try1
ArithmeticException
finally

3.常見異常

3.1 RuntimeException
  • 1、ArrayIndexOutOfBoundsException:下標越界異常,常見於陣列索引值大於等於陣列大小時丟擲。
  • 2、IllegalArgumentException:引數非法異常,當方法的引數型別不正確會出現
  • 3、ArithmeticException:算術異常,比如除數為0的時候
  • 4、NullPointerException:空指標異常,當使用的物件為null時會出現,Java8中可以使用Optional來處理null
3.2 IOException
  • 1、IOException:操作輸入輸出流時出現。
  • 2、FileNotFoundException:檔案未找到時出現
  • 3、EOFException:檔案已結束,主要用於資料輸入流的訊號結束。

3.3 其它常見異常

  • 1、ClassNotFoundException:類找不到異常,在classPath中未能找到對於類時會出現
  • 2、SQLException:運算元據庫時異常
  • 3、TimeoutException:超時異常

4.自定義異常

在實際開發中,通常在專案中封裝一個自定義異常類BaseException來繼承RuntimeException,業務異常可以繼承BaseException。

public class BaseException extends RuntimeException {
    public BaseException() {
        super();
    }

    public BaseException(String message, Throwable cause) {
        super(message, cause);
    }

    public BaseException(String message) {
        super(message);
    }

    public BaseException(Throwable cause) {
        super(cause);
    }
}

相關文章