1. 程式人生 > >Java的try...catch的用法和作用(為什麼要用try...catch)

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

得到了自己想要的資料。就很開心。