当try、catch、finally中有return时,程序该如何执行?

try、catch中有return,而finally中没有return

1、首先说明下,无论try、catch中是否有return,无论是否产生异常,finally代码是一定会执行的,代码验证如下:

 public int  handleTest1(){
          int b=0;
        try{
            System.out.println("try");
            int a=10/0;
            System.out.println("try 1");
            return  b;
        }
        catch(Exception e){
            System.out.println("catch ");
            b=b+1;
            return b;
            //return str;
        }
        finally {
            b=b+1;
            System.out.println("finally");
            //return 2;
        }
    }
    public static void main(String[] args){
    System.out.println("返回的结果"+new ExceptionHandle().handleTest1());
    }

在这里插入图片描述
导致上述结果的原因在于,代码在执行完try或者catch之后,会将返回的结果保存,当执行完finally代码块时,再将保存的值返回。仔细观察上述代码,你会发现在finally代码块中将b+1,并没有对catch代码块中的返回值产生影响,这是因为b值是基本类型,catch代码块保存返回值时将b值复制了一份,产生了一份副本,返回的是b的副本的值,因此finally代码块中的b+1加的b本身,而不是副本上,因此不会对返回值有影响。验证代码如下,在finnally返回b,最终返回的值是2而不是1。

  public int  handleTest1(){
          int b=0;
        try{
            System.out.println("try");
            int a=10/0;
            System.out.println("try 1");
            return  b;
        }
        catch(Exception e){
            System.out.println("catch ");
            b=b+1;
            return b;
            //return str;
        }
        finally {
            b=b+1;
            System.out.println("finally");
            return b;
            //return 2;
        }
    }
    public static void main(String[] args){
    System.out.println("返回的结果"+new ExceptionHandle().handleTest1());
    }

在这里插入图片描述
2、若返回的值是引用数据类型时,则另当别论,在finally中修改try或者catch的返回值,会影响返回的结果,因为返回值为引用数据类型时返回的是对象本身,而不是副本,在finally代码块中修改返回值,修改的是对象本身的值,因此会影响返回的结果。验证代码如下:

  public StringBuilder  handleTest(){
      StringBuilder sb=new StringBuilder("aaa");
   try{
      System.out.println("try"+sb);
      int a=10/1;
      return  sb;
   }
   catch(Exception e){
       System.out.println("catch 1");
       //return str;
   }
    finally {
      sb.append("bbb");
      System.out.println("finally"+sb);
      //return 2;
   }
       return null;
    }

在这里插入图片描述
3、再者我们发现即使try中有return,但只要异常发生,返回的结果还是catch中的返回值,这是因为当检测到异常发生时,出现异常的代码后面的程序都不会得到执行,而是转向catch代码块执行,例如下面验证代码中得try1这个字符串没有得到输出。

   public int  handleTest1(){
        try{
            System.out.println("try");
            int a=10/0;
            System.out.println("try 1");   
            return  0;
        }
        catch(Exception e){
            System.out.println("catch ");
            return 1;
            //return str;
        }
        finally {
            System.out.println("finally");
            //return 2;
        }
    }
    public static void main(String[] args){
    System.out.println("返回的结果"+new ExceptionHandle().handleTest1());
    }

在这里插入图片描述

try、catch、finally中都有return

当try、catch代码块中都有return时,发生异常时返回的是catch代码块的值,那当try、catch、finally代码块中都有return时,那返回的是哪个代码块中的值?当finally正常结束返回的是try或者catch中的返回值,而当finally有return,就相当于finally代码块提前结束,返回的是finally代码块中的返回值。验证代码如下:

    public int  handleTest1(){
        try{
            System.out.println("try");
            int a=10/0;
            System.out.println("try 1");
            return  0;
        }
        catch(Exception e){
            System.out.println("catch ");
            return 1;
            //return str;
        }
        finally {
            System.out.println("finally");
            return 2;
        }
    }
    public static void main(String[] args){
    System.out.println("返回的结果"+new ExceptionHandle().handleTest1());
    }

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值