java中關於try、catch、finally的總結


  面試的時候只要涉及到筆試,幾乎一定會涉及到的問題。有return的情況下try、catch、finally的問題

  結論

     1、不管有沒有異常,finally中的代碼都會執行

   2、當try、catch中有return時,finally中的代碼依然會繼續執行

   3、finally是在return后面的表達式運算之后執行的,此時並沒有返回運算之后的值,而是把值保存起來,不管finally對該值做任何的改變,返回的值都不會改變,依然返回保存起來的值。也就是說方法的返回值是在finally運算之前就確定了的。

   4、finally代碼中最好不要包含return,程序會提前退出,也就是說返回的值不是try或catch中的值

  舉例:

  情況1:try{}catch{}finally{} return;

      程序正常進行

  情況2:try{return;}catch{}finally{} return;

     a、先執行try中的語句,包括return后面的表達式,b、然后執行finally中的語句,c、最后執行try中的return      

     ps:返回值是try中的return后面的表達式的值,finally后面的return語句不會被執行

  情況3:try{} catch{return;} finally{} return;

     先執行try中的代碼塊

     有異常:a、先執行catch中的語句,包括return后面的表達式,b、然后執行finally中的語句,c、最后執行catch中的return,finally后面的return不會被執行

     無異常:執行finally中的代碼塊,然后執行return語句 

  情況4:try{return;} catch{} finally{return;}

     a、先執行try中的語句,包括return后面的表達式,b、然后執行finally中的語句,c、最后執行finally中的return     

     ps:返回的值是finally中return后面的表達式的值,因為finally中有return語句,所以會提前退出

  情況5:try{} catch{return} finally{return};

     先執行try中的代碼塊

     有異常:a、先執行catch中的語句,包括return后面的表達式,b、然后執行finally中的語句,c、最后執行finally中的return,因為finally中有return語句,所以會提前退出

     無異常:執行finally中的代碼塊,然后執行finally中的return

  情況6:try{return;} catch{return;} finally{return;}

     先執行try中的代碼塊,包括return后面的表達式

     有異常:a、先執行catch中的語句,包括return后面的表達式,b、然后執行finally中的語句,c、最后執行finally中的return,因為finally中有return語句,所以會提前退出

     無異常:執行finally中的代碼塊,然后執行finally中的return

  最總結論:在執行try、catch中的return之前一定會執行finally中的代碼(如果finally存在),如果finally中有return語句,就會直接執行finally中的return方法,所以finally中的return語句一定會被執行的。編譯器把finally中的return語句標識為一個warning.

  最后的例子:

  

public class Test {
	public int chang(){
		int chang = 0;
		try {
			chang = 10;
			return chang+=10;
		}
		finally{
			System.out.println("finally中的結果:"+chang);
			chang = 30;
		}
		
	}
	public static void main(String[] args) {
		Test te = new Test();
		int i = te.chang();
		System.out.println("main中的最后的結果:"+i);
	}
}

打印的結果是:

分析結果:

  1、先執行try中return后面的表達式,然后執行finally的語句

  2、返回值是try中return后面的表達式計算出來的值,即使finally中對chang進行了修改,也不會修改最后的返回值。try中先把計算出來的值放到不同於chang的局部變量中,執行完finally后在取出結果。應該是保存在函數棧中的。

  參考文章地址:http://blog.csdn.net/kavensu/article/details/8067850


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM