Java基礎 ---Throwable異常類

康世行發表於2020-12-03

 

前言:
   相信很多小夥伴在其他語言裡都是用過異常處理和丟擲過異常比如:VB裡丟擲異常使用Throw "異常提示"這種方式來丟擲異常嗎,C#直接宣告異常throw new Excption("異常提示資訊")。這兩種丟擲異常的方法,一種是過程化的而另一種是物件導向的思想。但是這兩種思想捕獲異常的方式是一樣的。

Try{

}catch(){

}

基本上都是這個格式,只是在使用的時候細節上會與點小差距。今天介紹java的異常處理,從根上介紹。從Exception的父類開始介紹,還有一個我們不能處理的異常Error這個是錯誤。錯誤是程式設計師不能自己處理的,只能交給jvm虛擬機器處理。

目錄

Throwable體系

Error

Exception

異常分類

編譯期異常

執行時異常

Throwable常用方法

public void printStackTrace() :

解釋:

程式碼:

public String getMessage() :

解釋:

程式碼:

public String toString() :

解釋:

程式碼:

異常處理方法

丟擲

捕獲

處理方法

try catch

呼叫者再次丟擲


Throwable體系

Error

Error:嚴重錯誤Error,無法通過處理的錯誤,只能事先避免,好比絕症。

Exception

Exception:表示異常,異常產生後程式設計師可以通過程式碼的方式糾正,使程式繼續執行,是必須要處理的。好 比感冒、闌尾炎。

異常分類

編譯期異常

:checked異常。在編譯時期,就會檢查,如果沒有處理異常,則編譯失敗。(如日期格式化異常)

執行時異常

runtime異常。在執行時期,檢查異常.在編譯時期,執行異常不會編譯器檢測(不報錯)。(如數學異 常)

Throwable常用方法

public void printStackTrace() :

解釋:

列印異常的詳細資訊。 包含了異常的型別,異常的原因,還包括異常出現的位置,在開發和除錯階段,都得使用printStackTrace。

程式碼:

try {
            Date date= sdf.parse("1998-0428");
        } catch (ParseException e) {
            e.printStackTrace();
        }

public String getMessage() :

解釋:

獲取發生異常的原因。 提示給使用者的時候,就提示錯誤原因。

程式碼:

 try {
            Date date= sdf.parse("1998-0428");
        } catch (ParseException e) {
             e.getMessage();
        }

public String toString() :

解釋:

獲取異常的型別和異常描述資訊(不用)。

程式碼:

  try {
            Date date= sdf.parse("1998-0428");
        } catch (ParseException e) {
            e.toString();
        }

異常處理方法

         在編寫程式時,我們必須要考慮程式出現問題的情況。比如,在定義方法時,方法需要接受引數。那麼,當呼叫方 法使用接受到的引數時,首先需要先對引數資料進行合法的判斷,資料若不合法,就應該告訴呼叫者,傳遞合法的 資料進來。這時需要使用丟擲異常的方式來告訴呼叫者。 在java中,提供了一個throw關鍵字,它用來丟擲一個指定的異常物件。

那麼,丟擲一個異常具體如何操作呢?

1. 建立一個異常物件。封裝一些提示資訊(資訊可以自己編寫)。

2. 需要將這個異常物件告知給呼叫者。

怎麼告知呢?

怎麼將這個異常物件傳遞到呼叫者處呢?

通過關鍵字throw 就可以完成。

throw 異常物件。

throw用在方法內,用來丟擲一個異常物件,將這個異常物件傳遞到呼叫者處,並結束當前方法的執行。

丟擲

格式

throw new 異常類名(引數);

例如:

throw new NullPointerException("要訪問的arr陣列不存在");
throw new ArrayIndexOutOfBoundsException("該索引在陣列中不存在,已超出範圍");

示例

public class ThrowDemo {
public static void main(String[] args) {
//建立一個陣列
int[] arr = {2,4,52,2};
//根據索引找對應的元素
int index = 4;
int element = getElement(arr, index);
System.out.println(element);
System.out.println("over");
}
/*
* 根據 索引找到陣列中對應的元素
*/
public static int getElement(int[] arr,int index){
//判斷 索引是否越界
if(index<0 || index>arr.length‐1){
/*
判斷條件如果滿足,當執行完throw丟擲異常物件後,方法已經無法繼續運算。
這時就會結束當前方法的執行,並將異常告知給呼叫者。這時就需要通過異常來解決。
*/
throw new ArrayIndexOutOfBoundsException("哥們,角標越界了~~~");
}
int element = arr[index];
return element;
}
}

捕獲

上面是直接把宣告的物件丟擲,下面演示如何處理丟擲的異常。(上面的這種方式不處理異常,程式會直接崩潰。)所以只要丟擲異常 呼叫者必須處理。

處理方法

try catch

public class TryCatchDemo4 {
 public static void main(String[] args) {
    try {
    read("a.txt");
 } catch (FileNotFoundException e) {
//抓取到的是編譯期異常 丟擲去的是執行期
throw new RuntimeException(e);
} finally {
System.out.println("不管程式怎樣,這裡都將會被執行。");
}
System.out.println("over");
}
/*
*
* 我們 當前的這個方法中 有異常 有編譯期異常
*/
public static void read(String path) throws FileNotFoundException {
if (!path.equals("a.txt")) {//如果不是 a.txt這個檔案
// 我假設 如果不是 a.txt 認為 該檔案不存在 是一個錯誤 也就是異常 throw
throw new FileNotFoundException("檔案不存在");
}
}
}

呼叫者再次丟擲

這個是異常不在內部處理,丟擲給呼叫者。(呼叫者如果是main方法的話還可以再次丟擲,這次丟擲是直接拋給JVM虛擬機器處理)

//判斷當前註冊賬號是否存在
//因為是編譯期異常,又想呼叫者去處理 所以宣告該異常
public static boolean checkUsername(String uname) throws LoginException{
for (String name : names) {
if(name.equals(uname)){//如果名字在這裡面 就丟擲登陸異常
throw new RegisterException("親"+name+"已經被註冊了!");
}
}
return true;
}

 

相關文章