一. 概念
異常是Java中提供的一種識别及響應錯誤情況的一緻性機制。有效地異常處理能使程式更加健壯、易于調試。
二.異常
error:系統内部錯誤,這類錯誤由系統進行處理,程式本身無需捕獲處理。
Exception:Exception是所有異常類的父類。分為非RuntimeException和RuntimeException。
非RuntimeException:指程式編譯時需要捕獲或處理的異常,如IOException、自定義異常等。屬于checked異常。
RuntimeException:指程式編譯時不需要捕獲或處理的異常,如:NullPointerException等。屬于unchecked異常。一般是由程式員粗心導緻的。如空指針異常、數組越界、類型轉換異常等。
三. 常用方法
Exception類和其他普通類一樣,有自己的屬性和方法,為我們提供異常的相關資訊。常用的方法有:
方法 說明
public String getMessage() 傳回關于發生的異常的詳細資訊。這個消息在Throwable類的構造函數中初始化了。
public void printStackTrace() 列印toString()結果和棧層次到System.err,即錯誤輸出流。
// 列印追蹤棧幀
e.printStackTrace();
// 擷取錯誤資訊
System.out.println(e.getMessage());
// 擷取錯誤棧幀的記憶體位址(沒有意義)
System.out.println(e.getStackTrace());
四.異常處理
4.1 throws
【文法格式】
修飾符 傳回類型 方法名(參數清單) throws 異常類名清單
throws多個異常,用逗号隔開,隻是提醒,不會真正處理,是以無所謂繼承關系
【示例】
public class TestException {
public static void main(String[] args) throws FileNotFoundException{
File file = new File(“our.txt”);
InputStream input = new FileInputStream(file);
}
}
【注意】
子類繼承父類,并重寫父類的方法時,若方法中抛出異常,則要求:子類方法抛出異常隻能是父類方法抛出的異常的同類或子類。
4.2 throw
throw的作用是抛出異常,抛出一個異常類的執行個體化對象。
【文法格式】
throw new XXXException();
【示例】
public class ExceptionDemo {
public static void main(String[] args) throws Exception {
Exception exp = new Exception(“異常方法示範”);
throw exp;
}
}
【總結】
這種抛出異常的方式一般在滿足某條件時主動抛出,即滿足使用者定義的邏輯錯誤發生時執行。
含有throw語句的方法,或者調用其他類的有異常抛出的方法時,必須在定義方法時,在方法頭中增加throws異常類名清單。
使用throws關鍵字聲明的方法表示此方法不處理異常,而交給方法調用處進行處理。
4.3 try…catch
【文法格式】
try{
有潛在異常抛出的語句組
}catch(異常類名 異常形參){
異常處理語句組
}catch(異常類名 異常形參){
異常處理語句組
}catch(異常類名 異常形參){
異常處理語句組
}catch(異常類名 異常形參){
異常處理語句組
}finally{
語句組
}
其中:
- try用來捕獲語句組中的異常
- catch用來處理異常可以有一個或多個,而且至少要有一個catch語句或finally語句
-
finally中的語句組無論是否有異常都會執行
常用捕捉異常方式
- try…catch try…finally
- try…catch…finally
-
try…catch1…catch2…finally(展現異常出現的大小順序)
說明:多重catch處理異常,大異常類在後,小異常類在前。
【示例】
(1)可以寫多個catch語句進行捕捉.但是從上到下要麼沒有繼承關系,要麼就是從子類到父類,不能寫父類到子類,因為父類就把子類異常捕捉了。
} catch (FileNotFoundException e) {
System.out.println(“找不到指定檔案”);
} catch (NullPointerException e) {
System.out.println(“不能為空”);
} catch (Exception e) {
System.out.println(“别的異常”);
}
(2)catch中可以有多個異常捕捉,不可以有繼承關系,如果有就直接寫父類,沒有的話 異常類型 | 異常類型 | 異常類型… e
} catch (NullPointerException | FileNotFoundException e) {
System.out.println(1);
} catch (RuntimeException e) {
e.printStackTrace();
}
(3)java1.7開始隻要把開啟資源的語句放到try(開啟資源語句){}就會自動關閉資源。
5.自定義異常
系統定義的異常主要用來處理系統可以預見的常見運作錯誤,對于某個應用所特有的運作錯誤,需要程式設計人員根據特殊邏輯來建立自己的異常類。
【文法格式】
public class 自定義異常類名 extends Exception{ … }
public static void m1(int age) throws myException {
if (age < 18 || age == 18) {
throw new myException(“年齡必須大于18歲”);
}
System.out.println(“注冊成功!!!”);
}
}
public class myException extends Exception {
public myException() {
}
public myException(String error) {
super(error);
}