try、catch、finally用法總結:
1、不管有沒有異常,finally中的代碼都會執行
2、當try、catch中有return時,finally中的代碼依然會繼續執行
3、finally是在return后面的表達式運算之后執行的,此時並沒有返回運算之后的值,而是把值保存起來,不管finally對該值做任何的改變,返回的值都不會改變,依然返回保存起來的值。也就是說方法的返回值是在finally運算之前就確定了的。
4、finally代碼中最好不要包含return,程序會提前退出,也就是說返回的值不是try或catch中的值
執行順序
1.
1 public static void main(String[] args) { 2 // TODO Auto-generated method stub 3 System.out.println(test()); 4 } 5 public static int test(){ 6 int i = 1; 7 try{ 8 i++; 9 System.out.println("try block, i = "+i); 10 }catch(Exception e){ 11 i ++; 12 System.out.println("catch block i = "+i); 13 }finally{ 14 i = 10; 15 System.out.println("finally block i = "+i); 16 } 17 return i; 18 }
結果輸出如下:
try block, i = 2
finally block i = 10
10
先執行try塊,並沒有捕獲到異常,finally 塊,最后return。
2.當我們把return放到try塊中和catch塊中,會怎么樣呢?你們會不會糾結先return呢還是先finally呢?返回值i會改變嗎?
1 public static void main(String[] args) { 2 // TODO Auto-generated method stub 3 System.out.println(test()); 4 } 5 public static int test(){ 6 int i = 1; 7 try{ 8 i++; 9 System.out.println("try block, i = "+i); 10 return i; 11 }catch(Exception e){ 12 i ++; 13 System.out.println("catch block i = "+i); 14 return i; 15 }finally{ 16 i = 10; 17 System.out.println("finally block i = "+i); 18 } 19 }
結果輸出如下:
try block, i = 2
finally block i = 10
2
如我們總結一樣:
2、當try、catch中有return時,finally中的代碼依然會繼續執行
3、finally是在return后面的表達式運算之后執行的,此時並沒有返回運算之后的值,而是把值保存起來,不管finally對該值做任何的改變,返回的值都不會改變,依然返回保存起來的值。也就是說方法的返回值是在finally運算之前就確定了的。
3.如果是操作不是基本類型會怎么樣?會不一樣嗎?為什么?
1 public static void main(String[] args) { 2 // TODO Auto-generated method stub 3 System.out.println(test().mmp("fuck")); 4 } 5 public static Person test(){ 6 Person person = new Person(); 7 try{ 8 person.setShengao("172cm"+"---try block"); 9 System.out.println("try block"); 10 return person; 11 }catch(Exception e){ 12 person.setTizhong("100kg"); 13 System.out.println("catch block"); 14 return person; 15 }finally{ 16 person.setXingbie("女"); 17 System.out.println("finally block "); 18 } 19 }
Person類
1 package xyz; 2 3 public class Person { 4 public String shengao; 5 public String tizhong; 6 public String xingbie; 7 8 //public String hello(String input); 9 10 public String getShengao() { 11 return shengao; 12 } 13 14 public void setShengao(String shengao) { 15 this.shengao = shengao; 16 } 17 18 public String getTizhong() { 19 return tizhong; 20 } 21 22 public void setTizhong(String tizhong) { 23 this.tizhong = tizhong; 24 } 25 26 public String getXingbie() { 27 return xingbie; 28 } 29 30 public void setXingbie(String xingbie) { 31 this.xingbie = xingbie; 32 } 33 34 35 public String mmp(String fuck){ 36 System.out.println("person : mmp"); 37 System.out.println("shengao:"+this.shengao); 38 System.out.println("tizhong:"+this.tizhong); 39 System.out.println("xingbie:"+this.xingbie); 40 return fuck; 41 } 42 43 }
結果輸出如下:
try block
finally block
person : mmp
shengao:172cm---try block
tizhong:null
xingbie:女
fuck
從上面可以看出,在finally中的set的性別 女 生效了,而在之前用基本類型,在finally中修改它的值不生效。為什么呢?
我們知道基本類型在棧中存儲,而對於非基本類型是存儲在堆中的,返回的是堆中的地址,因此內容被改變了。
4.如果在finally加入return,會怎么樣? 如果在finally 拋出了異常呢?
在finally中存在return,會有黃色警告:finally block does not complete normally 意思是finally代碼塊不能正常完成。