try-catch中finally执行的时机

原创 2017年01月03日 22:56:58

也许你的答案是在return之前,但往更细地说,我的答案是在return中间执行,请看下面程序代码的运行结果:

public  class Test {
    public static void main(String[] args) {
        System.out.println(new Test().test());
    }
    static int test() {
        int x = 1;
        try {
            return x;
        } finally {
            ++x;
        }
    }
}

———执行结果 ———
1

为什么呢?主函数调用子函数并得到结果的过程,好比主函数准备一个空罐子,当子函数要返回结果时,先把结果放在罐子里,然后再将程序逻辑返回到主函数。所谓返回,就是子函数说,我不运行了,你主函数继续运行吧,这没什么结果可言,结果是在说这话之前放进罐子里的。

public class  smallT {
    public static void  main(String args[]) {
        smallT t = new smallT();
        int b  = t.get();
        System.out.println(b);
    }
    public int  get() {
        try {
            return 1 ;
        } finally {
            return 2 ;
        }
    }
}

返回结果是 ———-
2

我可以通过下面一个例子程序来帮助我解释这个答案,从下面例子的运行结果中可以发现,try中的return语句调用的函数先于finally中调用的函数执行,也就是说return语句先执行,finally语句后执行,所以,返回的结果是2。return并不是让函数马上返回,而是return语句执行后,将把返回结果放置进函数栈中,此时函数并不是马上返回,它要执行finally语句后才真正开始返回。

用下面的程序来帮助分析:

public  class Test {
        public static void main(String[] args) {
        System.out.println(new Test().test());
    }
    int test() {
        try {
            return func1();
        } finally {
            return func2();
        }
    }
    int func1() {
        System.out.println("func1");
        return 1;
    }
    int func2() {
        System.out.println("func2");
        return 2;
    }
}

执行结果———–
func1
func2
2

**结论:finally中的代码比return 和break语句后执行。**
版权声明:回头看走过的路,片片落叶旋过眼前。

finally块中的代码什么时候被执行?finally是不是一定会被执行?(见最后引申)

问题描述:try{}里有一个return语句,那么紧跟在这个try{}后面的finally{}中的代码是否会被执行?如果会的话,什么时候被执行,在return之前还是return之后? 在Java...
  • Dove_Knowledge
  • Dove_Knowledge
  • 2017年05月02日 10:30
  • 3303

try-catch语句中return和finally执行顺序详解

刷java面试题偶然看到这类问题(try/finally中含有return时的执行顺序),觉得挺有意思于是小小的研究了一下,希望经过我添油加醋天马行空之后,能给你带来一定的帮助 原题 try {...
  • zhoushumin157016
  • zhoushumin157016
  • 2017年06月15日 09:29
  • 525

Java中finally的执行时机

finally是在catch执行之后return之前执行的。 那么,如果在finally中改变了catch中要返回的对象,那么,返回值改变了吗? 看代码: 上面代码输出是3,...
  • gua___gua
  • gua___gua
  • 2016年03月28日 15:54
  • 180

finally语句的执行时机

finally是在catch执行之后return之前执行的。 那么,如果在finally中改变了catch中要返回的对象,那么,返回值改变了吗? 看代码: 上面代码输出是3,...
  • qq_15037231
  • qq_15037231
  • 2017年07月17日 11:23
  • 49

Java中finally的执行时机

finally是在catch执行之后return之前执行的。 那么,如果在finally中改变了catch中要返回的对象,那么,返回值改变了吗? 看代码: 上面代码输出是3,...
  • kjfcpua
  • kjfcpua
  • 2013年01月12日 21:04
  • 434

return与finally到底谁先执行?

关于return与finally的强弱关系的解释。其中返回值的一些注意事项
  • zoujian1993
  • zoujian1993
  • 2015年04月29日 10:11
  • 919

iOS中try-catch-finally捕获异常使用

这也是自己在用到的时候搜集别人的资料总结的,希望能帮到大家!可能在iOS中不太经常用到,但是了解一下还是没坏处 @try{ 代码块1(可能出现异常的语句) //执行的代码,其中可能有异常。一旦发现异...
  • zhaojinqiang12
  • zhaojinqiang12
  • 2016年06月28日 16:48
  • 1054

关于try-catch、throw、finally在异常时的执行顺序

package test; //jdk 1.8 public class TestException1 { /** * catch中的return和throw是不能共存的(无论谁先谁后都编...
  • rainyspring4540
  • rainyspring4540
  • 2017年01月05日 11:04
  • 692

【Java】finally代码块不被执行的情况总结

以前跟别人讨论finally关键字,我总是简单的说:“fianly代码块中的代码一定会执行,一般用来清除IO资源等非内存资源(内存资源由GC机制回收)”。 今天翻书发现了几种不会执行的情况,现在总结下...
  • hj7jay
  • hj7jay
  • 2017年03月30日 09:22
  • 532

关于try-catch、throw、finally在异常时的执行顺序

今天我给大家讲解一下java的的错误和异常处理机制以及相关异常的执行顺序问题。如有不足的地方,欢迎批评指正~1、首相简单介绍一下java中的错误(Error)和异常(Exception)错误和异常的介...
  • csdn_duanjiao2016
  • csdn_duanjiao2016
  • 2017年11月10日 17:31
  • 44
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:try-catch中finally执行的时机
举报原因:
原因补充:

(最多只允许输入30个字)