在其他沒有支援例外處理的程式語言裡,必須自己檢查錯誤,再手動處理,就可能要用到很多if-else敘述,非常的麻煩。Java程式在執行時,如果發生異常狀況會產生一個Exception
物件,這時就可以借助例外處理來避免導致崩潰。
Java的例外處理可以將一般正常處理程序和錯誤的處理程序分開敘述,讓程式更清晰,其中有五個關鍵字:try、catch、finally和throws、throw。至於使用時機,像是資料庫連結失敗、找不到檔案、參數為空值或參數型態不符等等,這些都可以使用例外處理來避免發生錯誤。
正常處理程序的程式碼放在try{}區塊中,當捕捉到例外物件時就會進入到catch (MyException e) {}
裡,來執行錯誤處理程序的程式碼。try{}和catch{}程式區塊是缺一不可的,不過可以接多個catch{}程式區塊,但類別位階高的應該要放在類別位置低的後面
try {
// 正常處理程序的程式碼
} catch (MyException e1) { // 錯誤處理程序程式碼 }
catch (MyException e2) { // 錯誤處理程序程式碼 }
try{}和catch{}的部分跟上面提到的一樣,finally{}必須放在所有catch{}的後面,程式區塊裡則是放一定要執行的程式碼,也就是說無論發生什麼情況都會執行這部分,可以用來釋放有限的資源,像是關閉資料庫連線。
try {
// 正常處理程序的程式碼
} catch (MyException e1) { // 錯誤處理程序程式碼
} catch (MyException e2) { // 錯誤處理程序程式碼
} finally {
// 一定要執行的程式碼
}
Java中有兩種不同型態的例外,一種是在執行時期發生的例外,也稱為不必檢查的例外(unchecked exceptions),這一類其實不一定要處理;另一種是非執行時期的例外,被稱為必須檢查的例外(checked exceptions),這一類就一定要處理了,像是IOException、Exception。
在定義方法時可以用throws關鍵字把可能發生的例外丟給呼叫這個方法的程式去處理。
// 自訂的例外
void myMethod() throws MyException {...}
// java.lang
protected native Object clone() throws CloneNotSupportedException {...}
// jave.IO
public int read() throws IOException {...}
// java.sql
public static Connection getConnection() throws SQLException {...}
對於必須檢查的例外,再呼叫throws關鍵字時必須要把這個方法放在try{}程式區塊中,或是放在定義有throws關鍵字的方法中。
若想要自行丟出例外,您可以使用throw關鍵字,並生成指定的例外物件。這個可被丟出的物件必須是java.lang.Throwable類別的子類別。
throw 可被丟出的物件;
來舉個例子,在java裡如果用除法除到0,得到的結果會是Infinity,如果想要自行檢驗遇到除零錯誤,可以自行丟出 ArithmeticException例外,這個例外是在整數除法而且除數為0時所引發的例外,可以自己設定讓浮點數運算除數為 0時也丟出這個例外。
try {
double data = 100 / 0.0;
System.out.println("浮點數除以零:" + data); // 浮點數除以零:Infinity
if(String.valueOf(data).equals("Infinity"))
throw new ArithmeticException("除到0了啦");
}
catch(ArithmeticException e) {
System.out.println(e); // java.lang.ArithmeticException: 除到0了啦
}