5.2 異常處理

一、學習要求

書籍參考章節(jié): 第11章節(jié)

知識點:

  • 異常的概念
  • Exception類

二、參考知識

程序在運行過程中,可能會出現各種問題,如訪問的磁盤文件不存在,連接網絡錯誤,整數除0等,如果這些問題不處理,程序就會中止。java提供了異常處理機制。

異常的概念

異常是程序中的一些錯誤,但并不是所有的錯誤都是異常,并且錯誤有時候是可以避免的。
比如說,你的代碼少了一個分號,那么運行出來結果是提示是錯誤 java.lang.Error;如果你用System.out.println(11/0),那么你是因為你用0做了除數,會拋出 java.lang.ArithmeticException 的異常。
異常發(fā)生的原因有很多,常見的如:

  • 用戶輸入了非法數據。
  • 要打開的文件不存在。
  • 網絡通信時連接中斷,或者JVM內存溢出。

這些異常有的是因為用戶錯誤引起,有的是程序錯誤引起的,還有其它一些是因為物理錯誤引起的。-
要理解Java異常處理是如何工作的,你需要掌握以下三種類型的異常:

  • 檢查性異常:最具代表的檢查性異常是用戶錯誤或問題引起的異常,這是程序員無法預見的。例如要打開一個不存在文件時,一個異常就發(fā)生了,這些異常在編譯時不能被簡單地忽略。
  • 運行時異常: 運行時異常是可能被程序員避免的異常。與檢查性異常相反,運行時異??梢栽诰幾g時被忽略。
  • 錯誤: 錯誤不是異常,而是脫離程序員控制的問題。錯誤在代碼中通常被忽略。例如,當棧溢出時,一個錯誤就發(fā)生了,它們在編譯也檢查不到的。

Exception 類

所有的異常類是從 java.lang.Exception 類繼承的子類。
Exception 類是 Throwable 類的子類。除了Exception類外,Throwable還有一個子類Error 。
Java 程序通常不捕獲錯誤。錯誤一般發(fā)生在嚴重故障時,它們在Java程序處理的范疇之外。
Error 用來指示運行時環(huán)境發(fā)生的錯誤。
例如,JVM 內存溢出。一般地,程序不會從錯誤中恢復。

Java 內置異常類

Java 語言定義了一些異常類在 java.lang 標準包中。
標準運行時異常類的子類是最常見的異常類。由于 java.lang 包是默認加載到所有的 Java 程序的,所以大部分從運行時異常類繼承而來的異常都可以直接使用。
常見的內置異常類如:

異常 描述
ArithmeticException 當出現異常的運算條件時,拋出此異常。例如,一個整數"除以零"時,拋出此類的一個實例。
ArrayIndexOutOfBoundsException 用非法索引訪問數組時拋出的異常。如果索引為負或大于等于數組大小,則該索引為非法索引。
NullPointerException 當應用程序試圖在需要對象的地方使用 null 時,拋出該異常

捕獲異常

在編寫程序時,我們可以捕獲異常。
使用 try 和 catch 關鍵字可以捕獲異常。try/catch 代碼塊放在異??赡馨l(fā)生的地方。
try/catch代碼塊中的代碼稱為保護代碼,使用 try/catch 的語法如下:

try
{
   // 程序代碼
}catch(ExceptionName e1)
{
   //Catch 塊
}

catch 語句包含要捕獲異常類型的聲明。當保護代碼塊中發(fā)生一個異常時,try 后面的 catch 語句就會被檢查。
如果發(fā)生的異常包含在 catch 語句指定的異常類型中,異常會被傳遞到該 catch 語句塊,這和傳遞一個參數到方法是一樣。

下面看一個例子:

public class ExcepTest {
    public static void main(String[] args) {
        System.out.println("run1");
        int a[] = new int[5];
        System.out.println("run2");
        a[6]=5;
        System.out.println("run3");
    }
}

運行上面代碼,輸出的結果是:

run1
run2
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 6
    at com.ExcepTest.main(ExcepTest.java:12)

可以看出,輸出了run1和run2,沒有輸出run3,說明執(zhí)行到a[6]=5; 這個語句出問題了,導致程序中止執(zhí)行。因為數組的長度是5,這里對第7個元素賦值(數組的元素下標從0開始,0代表第1個元素)。數組越界,報ArrayIndexOutOfBoundsException異常。

這時我們可以捕獲異常,代碼如:

public class ExcepTest {
    public static void main(String[] args) {
        System.out.println("run1");
        int a[] = new int[5];
        System.out.println("run2");
        try {
            a[6] = 5;
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("catch Exception:" + e);
        }
        System.out.println("run3");
    }
}

運行上面代碼,輸出結果是:

run1
run2
catch Exception:java.lang.ArrayIndexOutOfBoundsException: 6
run3

可以看出,異常被捕獲了,程序沒有中止,繼續(xù)執(zhí)行。

多重捕獲塊

一個 try 代碼塊后面跟隨多個 catch 代碼塊的情況就叫多重捕獲。
多重捕獲塊的語法如下所示:

try{
   // 程序代碼
}catch(異常類型1 異常的變量名1){
  // 程序代碼
}catch(異常類型2 異常的變量名2){
  // 程序代碼
}catch(異常類型2 異常的變量名2){
  // 程序代碼
}

上面的代碼段包含了 3 個 catch塊。
可以在 try 語句后面添加任意數量的 catch 塊。
如果保護代碼中發(fā)生異常,異常被拋給第一個 catch 塊。
如果拋出異常的數據類型與 ExceptionType1 匹配,它在這里就會被捕獲。
如果不匹配,它會被傳遞給第二個 catch 塊。
如此,直到異常被捕獲或者通過所有的 catch 塊。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容