java-finally块和return执行先后顺序
2017-04-29 18:51
204 查看
来自牛客网的java笔试题:
输出是:
因为finally执行在return之前;
评论解析扩展学习:
从结果上看,貌似`finally` 里的语句是在`return` 之后执行的,其实不然,实际上`finally` 里的语句是在在`return` 之前执行的。那么问题来了,既然是在之前执行,那为什么`a` 的值没有被覆盖了?
实际过程是这样的:当程序执行到try{}语句中的return方法时,它会干这么一件事,将要返回的结果存储到一个临时栈中,然后程序不会立即返回,而是去执行finally{}中的程序, 在执行`a
= 2`时,程序仅仅是覆盖了a的值,但不会去更新临时栈中的那个要返回的值 。执行完之后,就会通知主程序“finally的程序执行完毕,可以请求返回了”,这时,就会将临时栈中的值取出来返回。这下应该清楚了,要返回的值是保存至临时栈中的。
再来看一个例子,稍微改下上面的程序:
在这里,finally{}里也有一个return,那么在执行这个return时,就会更新临时栈中的值。同样,在执行完finally之后,就会通知主程序请求返回了,即将临时栈中的值取出来返回。故返回值是2.
但是如果代码过程执行了System.exit(1),退出虚拟机的话,就不会执行finally了;
也不要在finally里执行return和throw语句,因为finally已经停止了方法的执行不会反悔执行try,cach里的return和throw块;
public class Test{ public int add(int a,int b){ try { return a+b; } catch (Exception e) { System.out.println("catch语句块"); } finally{ System.out.println("finally语句块"); } return 0; } public static void main(String argv[]){ Test test =new Test(); System.out.println("和是:"+test.add(9, 34)); } }
输出是:
finally语句块 和是:43
因为finally执行在return之前;
评论解析扩展学习:
public abstract class Test { public static void main(String[] args) { System.out.println(beforeFinally()); } public static int beforeFinally(){ int a = 0; try{ a = 1; return a; }finally{ a = 2; } } } /**output: 1 */
从结果上看,貌似`finally` 里的语句是在`return` 之后执行的,其实不然,实际上`finally` 里的语句是在在`return` 之前执行的。那么问题来了,既然是在之前执行,那为什么`a` 的值没有被覆盖了?
实际过程是这样的:当程序执行到try{}语句中的return方法时,它会干这么一件事,将要返回的结果存储到一个临时栈中,然后程序不会立即返回,而是去执行finally{}中的程序, 在执行`a
= 2`时,程序仅仅是覆盖了a的值,但不会去更新临时栈中的那个要返回的值 。执行完之后,就会通知主程序“finally的程序执行完毕,可以请求返回了”,这时,就会将临时栈中的值取出来返回。这下应该清楚了,要返回的值是保存至临时栈中的。
再来看一个例子,稍微改下上面的程序:
public abstract class Test { public static void main(String[] args) { System.out.println(beforeFinally()); } public static int beforeFinally(){ int a = 0; try{ a = 1; return a; }finally{ a = 2; return a; } } } /**output: 2 */
在这里,finally{}里也有一个return,那么在执行这个return时,就会更新临时栈中的值。同样,在执行完finally之后,就会通知主程序请求返回了,即将临时栈中的值取出来返回。故返回值是2.
但是如果代码过程执行了System.exit(1),退出虚拟机的话,就不会执行finally了;
也不要在finally里执行return和throw语句,因为finally已经停止了方法的执行不会反悔执行try,cach里的return和throw块;
相关文章推荐
- Java异常----try、catch和finally块中的return执行顺序
- java中try中return语句与finally块执行顺序问题
- Java中finally块与return之间的执行顺序
- Android面试之java基础try-catch-finally-return的执行先后顺序问题
- 关于Java中静态代码块以及构造函数的执行先后顺序
- Java异常处理---finally和return的执行顺序
- java中的return 语句和finally的执行顺序关系
- 【Java基础之finally和return】有return的情况下try catch finally的执行顺序
- java try语句块 finally和return 的执行顺序
- 关于Java中静态代码块以及构造函数的执行先后顺序
- Java中的继承与静态static等的执行先后顺序的面试题
- Java异常捕获之try-catch-finally-return的执行顺序
- Java中的继承与静态static等的执行先后顺序的面试题
- try中return语句与finally块的执行先后
- Java的块,静态块,构造函数,继承的执行先后顺序
- Java异常处理机制以及try-catch-finally-return执行顺序
- Java中的继承与静态static等的执行先后顺序的面试题
- Java中Return和Finally执行顺序的实现
- 【一道航天信息java笔试题】return语句和finally语句的执行顺序
- Java中的继承与静态static等的执行先后顺序的面试题