Java的try...catch的用法和作用(為什麼要用try...catch)
當程式執行過程中發生錯誤時,就會“ 丟擲異常',丟擲異常比終止程式要靈活得多,這是因為可以提供一個“ 捕獲” 異常的處理器 (handler) 對異常情況進行處理。
如果沒有提供處理器,程式就會終止,並在控制檯上打印出一條資訊, 其中給出了異常的型別。可能在前面已經看到過一些異常報告, 例如, 偶然使用了 null 引用或者陣列越界等。
異常有兩種型別: 未檢查異常和已檢查異常。 對於已檢查異常, 編譯器將會檢查是否提供了處理器。 然而,有很多常見的異常, 例如,訪問 null 引用, 都屬於未檢查異常。編譯器不會査看是否為這些錯誤提供了處理器。畢竟,應該精心地編寫程式碼來避免這些錯誤的發生, 而不要將精力花在編寫異常處理器上。
下面我們舉一個try...catch的小例子,
假如程式設計師a提供了一個方法藉口供程式設計師b使用,b用它實現某些功能,最後呈現給客戶c。
/** * b呈現給客戶c的方法。假設我們的列印是呈現給c的 * @param args * @throws Exception */ public static void main(String[] args){ String num = "1234tr"; System.out.println(numberFormat(num)); } /** * a提供的資料轉換的藉口 * @param num * @return */ public static int numberFormat(String num) { int x = Integer.parseInt(num); return x; }
當遇到這種情況時,假如客戶c傳入了一個不規則的字串,程式設計師a提供的方法就會直接打印出錯誤的異常,而程式設計師b有沒有經過處理,直接把異常呈現給了客戶c。客戶c一看勃然大怒,什麼垃圾程式。然後出現了一些列的問題。
Exception in thread "main" java.lang.NumberFormatException: For input string: "1234tr"
at java.lang.NumberFormatException.forInputString(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at Reflection.numberFormat(Reflection.java:11)
at Reflection.main(Reflection.java:7)
假如我們用這種方法:
首先,我們的程式設計師a先自己寫了一個返回結果的類,定義為ResponseDemo.class
public class ResponseDemo<T> {
private Integer code; //錯誤程式碼,100為正確,101為錯誤
private String message; //錯誤資訊
private T data; //轉換後的數值存放處
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
@Override
public String toString() {
return "ResponseDemo [錯誤編碼為=" + code + ", 錯誤資訊為=" + message + ", 資料=" + data + "]";
}
}
然後程式設計師a完善了自己的介面方法:
public static ResponseDemo<Integer> numberFormat(String num) {
ResponseDemo<Integer> response = new ResponseDemo<>();
try {
int x = Integer.parseInt(num);
response.setCode(100);
response.setMessage("資料轉化成功,已將值放入data下。");
response.setData(x);
} catch (Exception e) {
response.setCode(101);
response.setMessage("輸入的字串含有除了數字以外其他型別的格式,資料錯誤!");
}
return response;
}
然後程式設計師b也完善了自己的方法呈現給客戶c:
/**
* b呈現給客戶c的方法。假設我們的列印是呈現給c的
* @param args
* @throws Exception
*/
public static void main(String[] args){
String num = "1234tr";
ResponseDemo<Integer> reponse = numberFormat(num);
if(reponse.getCode() == 101) {
System.out.println(reponse.getMessage());
}else {
System.out.println(reponse.getData());
}
}
這樣,即使客戶c輸入了錯誤的字串,他也只會給程式設計師b返回這個物件:
ResponseDemo [錯誤編碼為=101, 錯誤資訊為=輸入的字串含有除了數字以外其他型別的格式,資料錯誤!, 資料=null]
然後程式設計師b通過對物件的處理,最後給客戶c呈現了這樣的資訊:
輸入的字串含有除了數字以外其他型別的格式,資料錯誤!
然後客戶c看到了這個資訊,發現是自己的輸入的資訊有誤,輸入了正確的字串。123456,然後繼續執行:
123456
得到了自己想要的資料。就很開心。