问到finally代码块的执行顺序,就算刚刚学编程的新手都能好不犹豫的说出答案:不管异常与否,finally语句块的代码一定会被执行!虽然博主尚未完全搞懂其中奥妙,但是希望下面的代码能引起读者的深思,有人觉得明白与否没有太大意义,但我相信每个向上的人面对知识时都要有一颗近乎朝圣的心,因为我们是站在巨人或前人的肩膀上前进,因为我们还很渺小!其实明白与否很有意义,因为它涉及着你以后在finally代码块中的逻辑。话不多说,请看代码:
public class finallyTest { public static void main(String[] args) { System.out.println("main: x = "+test()); } private static int test() { int x = 1; try{ System.out.println("try: x = "+x); return x; }catch(Exception e){ throw new RuntimeException(e); }finally{ ++x; System.out.println("finally: x = "+x); } } }
运行结果如下:
从运行结果上分析,try语句中代码先执行这是毫无疑问了,此时 x=1, 然后根据我们以往所了解的一样,在return语句之前执行finally语句块中的代码,此时 x自增1 值变为2 并输出,从结果上来看也是没有错误的,但是,请注意,在try语句块中return给主函数的 x 的值应该是2啊,怎么会是1呢?finally语句中的代码明明是执行过的了啊,此时博主就猜想,难道JVM在执行return语句的时候又开了一个线程去执行finally代码块而自己只管返回结果?于是在这样的猜想下进行了下边的验证:
在执行return语句之前阻塞500毫秒,等待finally语句块执行完毕后再让return语句返回x的值,那么这次的结果会如何呢???
import java.util.*; import java.text.*; public class finallyTest { static int x = 1; public static void main(String[] args) { System.out.println("main: x = "+test() +" : "+printTime()); } private static int test() { try{ System.out.println("try: x = "+x +" : "+printTime()); Thread.sleep(500); return x; }catch(Exception e){ throw new RuntimeException(e); }finally{ ++x; System.out.println("finally: x = "+x +" :"+printTime()); } } //打印当前时间 格式为: 分:秒:毫秒 public static String printTime(){ Date date = new Date(System.currentTimeMillis()); SimpleDateFormat sdf = new SimpleDateFormat("mm:ss:SS"); return sdf.format(date); } }
执行结果如下:
相信读者读到这一步会不会觉得奇怪呢?会不会觉得耐人寻味呢?明明 x 的值已经变成2了但是主函数接受到的仍然是1,这究竟是为什么呢?于是博主就四处搜寻了一些有关方面的介绍,于是有了如下猜想:众所周知,return语句有两个作用,一是返回结果,二是终止执行,那么会不会是在执行到return语句时,先将x的值返回给调用者,然后再执行finally语句块中的代码,最后再执行终止的作用呢?
时间: 2024-12-29 12:03:56