一、異常的概念
是一種Java處理程序在運行時而不是編譯時的錯誤機制,出現異常事件的時候會生成異常對象,該異常對象封裝了異常事件的信息並將提供給Java運行時系統。
Java的異常類分爲可捕獲和必須捕獲兩類,
舉給例子,ArithmeticException這個異常,就是RuntimeException下面的,比如程序中除數是0的時候就會拋出這個異常。Error是程序中無法處理的錯誤,是虛擬機層次的,而Exception是可以在程序中處理的,Exception下面的RuntimeException是可以捕獲也可以不捕獲的異常,除此之外的異常都是必須捕獲的,ArithmeticException異常的繼承關係如下圖
public class exc {
exc() {
System.out.println(2/0);
}
public static void main(String[] args) {
exc test = new exc();
}
}
編譯是沒問題的,輸出如下:
提示說在main裏面有異常發生。System.out.println(2/0);這一句的異常如何捕獲:
public class exc {
exc() {
try{
System.out.println(2/0);
}catch (ArithmeticException e) {
System.out.println("除數不能爲0");
e.printStackTrace();
}
}
public static void main(String[] args) {
exc test = new exc();
}
}
e.printStackTrace();
這是把堆棧信息打印出來,就是錯誤的詳細信息,不加這一行,輸出結果就只有“除數不能爲0”
上面的e實際上是一個對象名,有異常發生的時候,會生成異常對象,這個名字是可以隨便取的。
二、方法聲明和拋出異常
定義一個方法,但是這個方法有可能在運行的時候拋出異常,見下面程序:
public void method() throws SomeException {
if (something) {
throw new SomeException("錯誤提示");
}
}
在方法名後面用throws關鍵字聲明這個方法有可能會拋出異常, SomeException是舉例拋出的異常名字,方法體裏面滿足某條件以後就用關鍵字throw來拋出異常。
調用該方法的時候,要捕獲異常(當然有些異常是不用捕獲的RuntimeException)
try {
method();
}catch (SomeException e) {
//捕獲以後的處理代碼
}
多個異常,可以一個try多個catch
void f() throws FileNotFoundException , IOException {
FileInputStream in = new FileInputStream("myfile.txt");
int b;
b = in.read();
while (b != -1) {
System.out.print((char) b);
b = in.read();
}
}
void f2() throws IOException {
try {
f();
} catch (FileNotFoundException e) {
System.out.println(e.getMessage());
} catch (IOException e) {
e.printStackTrace();
}
}
當異常發生的時候,程序會終止當前流程,根據捕獲的異常類型去執行相應的catch代碼段。
三、finally關鍵字
finally裏面的語句是始終都要執行的。
格式類似如下:
try {
method();
}catch (SomeException e) {
//捕獲以後的處理代碼
}catch (SomeException1 d) {
//捕獲以後的處理代碼
}finally {
//do something
}
四、注意點
1、多個捕獲catch的時候,不能先捕獲大的,再捕獲小的,比如:
try {
method();
}catch (Exception e) {
//捕獲以後的處理代碼
}catch (ArrayIndexOutOfBoundsException d) {
//捕獲以後的處理代碼
}
這裏第一次捕獲的是Exception,已經包含了所有的異常,下面再捕獲數組越界異常,就會報錯,因爲前者已經包含後者。
2、重寫一個方法的時候,原方法所拋出的異常是什麼類型,重寫以後就必須是拋出什麼類型,或者重寫以後選擇不拋出也可以,如果要拋出,就必須和原方法一模一樣。