java 捕獲和拋出異常
異常通常是程序運行時出現的問題和錯誤。如:客戶輸入數據的格式,讀取的文件是否存在,網絡是否保持通暢等。java程序在執行過程中發生的異常事件分為:異常和錯誤
異常:(Exception)
異常指程序運行過程中出現的非正常現象。可能遇到的輕微錯誤,可以寫代碼處理異常並繼續繼承執行,不應讓程序中斷。
錯誤:(Error)
錯誤事件的發生通常會阻止程序正常運行。對於java虛擬機無法解決的嚴重問題,如jvm系統內部錯誤,資源耗盡等情況,一般不編寫針對性的代碼進行處理。
對於被認為是不能恢復的嚴重錯誤,不應該拋出,而應該讓程序中斷。
錯誤與異常最大的區別是錯誤往往比異常嚴重,發生了錯誤,一般不能在應用程序中捕獲處理,程序只能非正常終止運行。
異常的簡單分類:
(1):檢查性異常
最具有代表性的是用戶錯誤或者是問題引起的而異常,這是程序員無法預見的。例如要打開一個不存在的文件時,異常就發生了,這些異常在編譯時不能被簡單的忽略。
(2):運行時異常
它是可能被程序員避免的異常,與檢查性異常相反,運行時可以在編譯時被忽略。
(3):錯誤
錯誤不是異常,而是脫離程序員控制的問題,錯誤在代碼中通常被忽略。例如當棧溢出時,一個錯誤就發生了,他們在編譯中也查不到。
java把異常當做對象來處理,並定義一個基類java.lang.Throwable作為所有異常的超類。
java異常層次結構圖如下:
異常處理機制(捕獲)
拋出異常:當出現異常事件時,系統會自動產生一個異常對象,然后將其傳遞給java運行時系統。這個異常產生和提交的過程稱為拋出異常。
捕獲異常:當java運行時系統得到異常對象以后,它將尋找處理這一異常的方法,找到之后,運行時系統把當前異常對象交給該方法進行處理。這一過程稱為捕獲。
異常處理的一般步驟為:異常拋出---->異常捕獲---->異常處理
java異常機制主要依賴於try,catch,finally,throws,throw五個關鍵字。
try:它里面放置的是可能引發的異常類型。
catch:后面對應異常類型一個代碼塊,用於表明catch塊用於處理這種類型的代碼塊。可以有多個catch塊。
finally:主要用來處理后續事情。finally塊總是被執行,如果finally中使用了return或者throw等終止方法的語句,不會跳回執行,而是直接執行。
下面來兩個簡單的代碼示例:
分母不能為0的異常並捕獲
package exception;
public class Test {
public static void main(String[] args) {
int a = 1;
int b = 0;
// System.out.println(a/b);//出現異常,分母不能為0.ArithmeticException
//下面我們來捕獲這個異常,try——catch
try {//try 用來檢測區域
// System.out.println(a/b);
}catch (ArithmeticException e){//catch(可能發生的異常類型) 捕獲異常
System.out.println("程序出現異常,變量不能為0");
}finally {//處理后續工作
System.out.println("finally");
}
}
}
方法的棧調用異常並捕獲
public class Test {
public static void main(String[] args) {
int a = 1;
int b = 0;
// System.out.println(a/b);//出現異常,分母不能為0.ArithmeticException
//下面我們來捕獲這個異常,try——catch
try {//try 用來檢測區域
new Test().a();//通過對象點名來調用這個方法
}catch (Throwable e){//catch(想要捕獲的異常類型)// 捕獲異常
System.out.println("程序出現異常,變量不能為0");
}finally {//處理后續工作
System.out.println("finally");
}
}
public void a(){ b(); }
public void b(){ a(); }
}
當我們想捕獲多個異常時,可以像循環結構那樣,並列catch模塊
多個異常捕獲時
/*
當我們想要捕獲多個異常時
catch(){
}catch(){
}catch(){
//括號內捕獲的異常類型要從小到大去寫。error>exception>throwable
}
*/
我們可以通過快捷鍵alt+Ctrl+T選中含有異常的代碼語句,自動生成try-catch-finally。
throw語句
throw通常用來明確的拋出一個異常
if(異常條件1 成立)
throw new 異常1();
if(異常條件2 成立)
throw new異常2();
簡單代碼示例
在try檢測模塊內主動拋出異常
try {//try 用來檢測區域
if(b==0){//使用throw關鍵字來拋出
throw new ArithmeticException();//主動拋出這個異常
}
System.out.println(a/b);
throws語句
throws語句用來聲明一個異常。
public class Test {
public static void main(String[] args) {
try {
new Test().test(1,0);
} catch (ArithmeticException e) {
e.printStackTrace();
} finally {
}
}
//假設方法中處理不了這個異常,需要在方法上拋出異常
public void test (int a,int b) throws ArithmeticException{//在這個方法里聲明這個異常
if (b == 0) {
throw new ArithmeticException();//主動拋出的異常,一般在方法中
}
System.out.println(a / b);
}
}