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表示可能丟擲異常,並不一定會發生這些異常,呼叫者只是知道該方法可能出現的問題,可以預先給出處理方法
丟擲異常後都是讓呼叫者去接收並進行相關處理
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);
}
}