try、catch、finally用法總結


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代碼塊不能正常完成。


免責聲明!

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



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