Java異常執行路徑

1 問題引入

public class Test{
	public static void main(String[] args) {
		int str = getMsg();
		System.out.println(str);
		
		//控制檯會輸出什麼?"123"還是"456"
	}
	
	public static String getMsg() {
		try{
			int a = 1/0;
		} catch(ArithmeticException e) {
			return "123";
		}
		
		return "456";
		
	}
}

在上述的代碼片段中,程序跑起來會在控制檯輸出什麼?答案是輸出了”123”。
在try-catch塊中,程序從try塊發生異常處直接跳轉到異常捕獲處,然後順序執行其後的代碼。

2 異常概念

Java的基本理念是“結構不佳的代碼不能運行”。改進的錯誤恢復機制是提供代碼健壯性的最強有力的方式。Java使用異常來提供一致的錯誤報告模型。Java的異常處理的目的是在於通過使用少於目前數量的代碼來簡化大型的、可靠的程序的生成,並且通過這種方式來讓你更加自信。異常處理機制可以降低錯誤處理代碼的複雜度,如果不使用異常,那麼就必須檢查特定的錯誤,並在程序的許多地方去處理它,而如果使用異常,那就不必在方法調用處進行檢查,因爲異常機制將保證能捕獲這個錯誤。這種機制不僅節省代碼,而且把“描述在正常執行的過程中做什麼事”的代碼和“出了問題怎麼辦”的代碼相分離。

2.1 捕獲異常

2.1.1 try塊

如果在方法內部拋出了異常,(或者在方法內部掉喲個的其他方法拋出了異常),這個方法將在拋出異常的過程中結束。如果不希望方法就此結束,可以在方法內設置一個特殊的塊來捕獲異常。因爲在這個塊裏嘗試各種可能產生異常的方法調用,所以稱爲try塊。

try {
	//code that might generate exceptions
}

2.1.2 異常捕獲程序

拋出的異常必須在某個地方得到處理,這個地點就是異常處理程序,而且針對每個要捕獲的異常,得準備相應的處理程序。異常捕獲程序緊跟在try之後,以關鍵字catch表示

try{
//code that might generate exceptions
} catch(Type1 id1) {
	//Handle exceptions of Type1
} catch(Type2 id2) {
	//Handle exceptions of Type2
} catch (Type3 id3) {
	//Handle exceptions of Type3
}

2.1.3 使用finally進行清理

對於一些代碼,可能會希望無論try塊內的代碼異常是否拋出,它們都能得到執行。這通常適用於內存回收之外的情況,諸如文件的關閉等情況。需要清理的資源包括:已經打開的文件或網絡連接,在屏幕上畫的圖形,甚至是外部世界的某個開關

3 總結

當拋出異常後,有幾件事會隨之發生。首先,同Java中其他對象的創建一樣,將使用new在堆上創建異常對象。然後,當前的執行路徑(它不能繼續下去了)被終止,並且從當前環境中彈出對異常對象的引用。此時,異常處理機制接管程序,並開始尋找一個恰當的地方來繼續執行,這個恰當的地方就是異常處理程序,它的任務是將程序從錯誤狀態中恢復,以使恆旭要麼換一種方式運行,要麼繼續運行下去。有了該段描述之後,也就很好理解了開頭的代碼片段了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章