一、異常處理機制
1、異常的祖先是Throwable,有如下兩個子類:
a、Error:表示錯誤,錯誤產生后程序員不能通過代碼的方式糾正,只能事先避免,好比生命已經停止。
b、Exception:表示異常,異常產生后程序員可以通過代碼的方式糾正,使程序繼續運行,是必須要處理的
2、 Throwable中的常用方法
public void printStackTrace();打印異常的詳細信息
public String getMessage();獲取發生異常的原因
二、異常分類:
1):編譯時期異常:Checked:Exception類和他的子類,除了運行時期異常其他的就是編譯時期異常.
2):運行時期異常:Runtime: RuntimeExeption類和RuntimeException的子類.
編譯時異常: 要求我們必須處理異常(throws/try-catch),不處理,則編譯不能通過.
運行時異常: 可處理,可不處理.
處理異常的方法:
1、使用try-catch
在開發過程中建議使用這個異常處理機制,進行專業處理。Try必須與catch或finally同在,不能單獨使用,二者必須出現一個。finally塊中的語句一定會執行,無論是否存在錯誤。除非在try或catch語句中出現了退出JVM的語句,不執行。
finally與return先后執行問題:
public class FinallyDemo {
public static void main(String[] args) {
System.out.println(show());
}
/* 判斷return與finally哪個先執行:
* 1、直接在try中返回一個變量
* 2、在finally中讓這個變量自增,打印出結果
* 如果是finally先執行的那么finally執行完之后變量的結果就
* 會自行的加一,如果是return先執行那么就會先返回在進行自增
* */
public static int show() {
System.out.println("...start...");
int mun = 1;
try {
return mun;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
//一定會執行的代碼快,除非在該代碼執行之前
//就執行了system.exit(0);就不會執行該代碼塊
mun++;
System.out.println(mun);
}
System.out.println("...end.....");
mun++;
return mun;
}
}
2、拋出異常
拋出異常的方式有兩種:
1):在方法的內部使用throw,拋出一個異常對象.如果拋出的異常是一個編譯時期異常,就必須在方法后面聲明拋出的異常類型,如果是運行時期的異常就不需要聲明異常類型
如下面的程序,可能出現的編譯時期異常有FileNotFoundException,與ArithmeticExcepting.就必須在方法后面聲明,否則編譯出錯
如果出現的異常為編譯時期異常時,我們還可以將其轉換成運行時期異常就不用在方法后面聲明了。例如:
JDK1.7中的throw的新特性:如果throw拋出的真實異常是編譯時期異常也必須在方法后面聲明異常類型
2):在方法上使用throws聲明可能拋出的異常類型.
這個方法是將異常交給調用者,此異常為非運行時期異常。一旦使用throws,當前方法就不再過問該異常,交給調用者處理。