1. 程式人生 > >Java中異常分類和Throw和Throws的區別

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

#### 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多個異常](https://img2020.cnblogs.com/blog/1025562/202005/1025562-20200525114315525-1249271139.png) 丟擲異常後都是讓呼叫者去接收並進行相關處理 #### 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);