iT邦幫忙

2022 iThome 鐵人賽

DAY 23
0
Software Development

Java入門的30張門票系列 第 23

[Day23] 例外處理 - Exception物件

  • 分享至 

  • xImage
  •  

在其他沒有支援例外處理的程式語言裡,必須自己檢查錯誤,再手動處理,就可能要用到很多if-else敘述,非常的麻煩。Java程式在執行時,如果發生異常狀況會產生一個Exception物件,這時就可以借助例外處理來避免導致崩潰。

Java的例外處理可以將一般正常處理程序和錯誤的處理程序分開敘述,讓程式更清晰,其中有五個關鍵字:try、catch、finally和throws、throw。至於使用時機,像是資料庫連結失敗、找不到檔案、參數為空值或參數型態不符等等,這些都可以使用例外處理來避免發生錯誤。

try-catch

正常處理程序的程式碼放在try{}區塊中,當捕捉到例外物件時就會進入到catch (MyException e) {}裡,來執行錯誤處理程序的程式碼。try{}和catch{}程式區塊是缺一不可的,不過可以接多個catch{}程式區塊,但類別位階高的應該要放在類別位置低的後面

try {
    // 正常處理程序的程式碼
} catch (MyException e1) { // 錯誤處理程序程式碼 }
  catch (MyException e2) { // 錯誤處理程序程式碼 }

try-catch-finally

try{}和catch{}的部分跟上面提到的一樣,finally{}必須放在所有catch{}的後面,程式區塊裡則是放一定要執行的程式碼,也就是說無論發生什麼情況都會執行這部分,可以用來釋放有限的資源,像是關閉資料庫連線。

try {
    // 正常處理程序的程式碼
} catch (MyException e1) { // 錯誤處理程序程式碼 
} catch (MyException e2) { // 錯誤處理程序程式碼 
} finally {
    // 一定要執行的程式碼
}

throws 關鍵字

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 關鍵字

若想要自行丟出例外,您可以使用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了啦
}

上一篇
[Day22] 基本型態包裹器 - Wrapper Classes
下一篇
[Day24] 斷言 assertions
系列文
Java入門的30張門票30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言