java 異常捕獲和捕獲中的一些陷阱

異常是在執行期出現的錯誤,運行的時候出現的,而不是編譯的時候出現的錯誤,設計一個良好的程序的時候我們應該考慮到這些問題,從而保證出現異常的時候不會使程序崩潰掉,從而給用戶更好的體驗感,java強迫程序員要來捕獲程序運行過程中可能會出現的異常,在可能出現異常的地方,可以生成一個異常類對象,我們可以通過這個對象,這個對象會將異常的信息封裝起來交給正在運行的java系統,這就是所說的拋出異常(throw),java系統接受到這一個異常之後會尋找能夠處理這異常的代碼,然後對其進行處理,這一過程被稱作異常的捕獲(catch),首先根據下面這張圖來介紹一下異常的類型有哪些。


在exception的下面有兩個類分別爲RuntimeException和Checked,第一中異常是在運行期間出現的異常我們可以不用對其進行捕獲,但是第二種異常我們是必須要對其進行捕獲的,而且是java強制的,我們必須要對其進行捕獲。

然後就是finally關鍵字,這個一般是我們放在catch之後來用的,這個可以幫助我們用來完成一些資源的回收等,也許你現在會問,資源的回收不是有java的垃圾回收機制嗎?好吧,這裏的回收是對物理資源進行的回收而垃圾回收機制的回收是對我們的內存的回收,這裏的回收有關閉網絡連接呀,關閉已經打開的數據庫呀?等等,說的finally,我們在這裏就會引出一些問題,通過代碼來看一下。

public static void main (String[]args){
	    int a = cal();
	    System.out.println(a);
	}
	public static int cal (){
	    int count = 5;
	    try{
		return ++count;
	    }
	    finally {
		System.out.println("已被執行");
		return count++;
	    }
		    
	}
程序輸出結果是“已被執行”和6;輸出已被執行說明finally方法已經被執行了,輸出6說明try方法中的代碼段未被執行這也就說明了,這就是反應出了finally的執行問題,當在try方法中遇到return語句會調轉到finally語句中,如果finally語句中並沒有return語句就會立刻返回到原先的代碼段中,但是如果有了return語句我們就需要會從這裏返回,不再去執行try中的代碼。也就是finally中的語句會在最後被執行,用來釋放資源等進行一些處理,但是如果在方法中出現了System.exit(0),此時給程序就會停止,因爲這個程序是將程序當前所在的線程進行了中斷,任何都不會在繼續執行。

catch中我們需要的注意的問題就是我們不能夠去捕獲try區不可能產生的異常,然後關於catch的問題就是關於其執行順序的問題,以及對異常的捕獲,我們需要的是先小後大對其進行捕獲,首先是對捕獲其子類的異常然後再去捕獲父類異常,如果顛倒順序,程序就會出現異常。還有就是不能夠利用catch來代替流程控制,因爲異常捕獲的機制是java爲異常捕獲開設的。對於catch中我們應該做出一些能夠對程序崩潰的異常可以進行修復的操作,對於不能夠處理的異常我們就需要用throws方法,當該方法被調用的時候我們就需要對該方法進行一個異常的捕獲。



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