关于try,finally里面的return,到底谁先执行的问题

      在JAVA语言的异常处理中,finally里面代码块是为了保证无论出现了什么样的情况,finally里的代码一定会被执行。但是return 的意思就是结束当前函数的调用并跳出这个函数,因此finally块里面的代码也是在return前执行,如果try finally里都有return,那么 finally中的return将覆盖其他地方的return.代码如下:

class FinallyTest
{
  public int method1()
  {
    try {
      return 2;
    }
    catch(Exception e) {return 3;}
  }


  public int method2()
  {
    try {
      return 3;                                               //1
    }
    finally {                                                 //2
      return 4;
    }
  }


  public static void main(String args[])
  {
    FinallyTest ft = new FinallyTest();
    System.out.println("method1 returns " + ft.method1());    //3
    System.out.println("method2 returns " + ft.method2());    //4
  }
}
运行结果是:method1 returns 2
                      method2 returns 4

      下面步入正题:如果try里面有return,是先执行return 还是先执行finally,

这个问题我问过很多人,也得到了很多答案

以下是讨论过程:

肖:

 其实应该还是之前的,虽说是保存了返回的代码,但也是保存,还没返回,执行完finally才把之前保存的掉出来,总觉得中间怪怪的,
 网上的说法,不是先执行,是先保存起来,然后执行finally,然后再执行return

陈:
 在java的语言规范有讲到,如果在try语句里有return语句,finally语句还是会执行。它会在把控制权转移到该方法的调用者或者构造器前执行finally语句。也就是说,使用return语句把控制权转移给其他的方法前会执行finally语句。


郭:

 刚刚那道题finally里的return也会执行,只不过改变不了返回值,还是返回try里面的return的值

《practical java》讲过这个问题,有兴趣可以看看
下面贴我自己的部分代码:
public class ReturnTest {
    public static void main(String args[]){
        int a = test();
        System.out.print(a);
    }
    static int test() {
        int x = 1;
        try {
            return  ++x ;
        } finally {
            if (x > 1) {
                x += 10;
            }
        }
    }
}


运行结果:x=:2
由此可见,在运行finally之前,x就已经等于2,但是控制台里finally里面的x=:先执行,再执行的return 2,且x+=10这句话根本没对return的值造成影响,再综合以上朋友说的,我觉得可以总结为:
       运行时,在try中,要返回的结果已经准备好了,就在这个时候,程序跳到了finally,这个时候结果已经放到了x的局部表量中,执行完finally后,再取出结果,finally对x进行了改变,但不会影响返回的结果。


                
CREATE TABLE `conflict_flow_path` ( `id` int NOT NULL AUTO_INCREMENT COMMENT '主键Id', `version` int NOT NULL DEFAULT '1' COMMENT '乐观锁', `creator` varchar(32) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL COMMENT '创建人', `created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `updator` varchar(32) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin DEFAULT NULL COMMENT '更新人', `updated_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间', `data_status` char(1) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL DEFAULT '1' COMMENT '数据状态 1正常', `group_id` int DEFAULT NULL COMMENT '组织ID', `group_no` varchar(32) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin DEFAULT NULL COMMENT '机构编号', `dept_id` int DEFAULT NULL COMMENT '部门ID', `tenant_id` int DEFAULT NULL COMMENT '租户ID', `project_id` int DEFAULT NULL COMMENT '租户id', `conflict_id` int NOT NULL COMMENT '矛盾基础信息id', `conflict_status` varchar(10) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL COMMENT '矛盾状态', `conflict_operate_description` varchar(10) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL COMMENT '矛盾操作描述', `accept_user_id` varchar(32) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin DEFAULT NULL COMMENT '受理人id', `relate_dept_id` varchar(32) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin DEFAULT NULL COMMENT '相关部门:受理/上报/下派', `operation_content` varchar(2000) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin DEFAULT NULL COMMENT '操作说明:受理过程/备注/退回原因', `accept_file` text CHARACTER SET utf8mb3 COLLATE utf8mb3_bin COMMENT '受理文件', `task_id` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin DEFAULT NULL COMMENT '任务id', `relate_group_id` varchar(32) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin DEFAULT NULL COMMENT '关联部门行政区划id', PRIMARY KEY (`id`) USING BTREE, KEY `index_conflict_id` (`conflict_id`) USING BTREE, KEY `index_1` (`id`,`creator`,`created_time`,`data_status`,`group_id`,`group_no`,`dept_id`,`conflict_id`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=705348 DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_bin ROW_FORMAT=DYNAMIC COMMENT='矛盾调解-流程表';
03-22
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值