码迷,mamicode.com
首页 > 其他好文 > 详细

try、catch、finally用法总结(二)

时间:2018-07-05 23:35:01      阅读:153      评论:0      收藏:0      [点我收藏+]

标签:this   stat   catch   表达式   类型   pac   getx   修改   return   

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

 就不贴代码了,有兴趣的自己试试吧。

                        《完》

 

 

 

finally中有return 会出现警告finally block does not complete normally

 

try、catch、finally用法总结(二)

标签:this   stat   catch   表达式   类型   pac   getx   修改   return   

原文地址:https://www.cnblogs.com/oldthree3/p/9270541.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!