java-finally块和return执行先后顺序
来源:互联网 发布:共享景观设计 知乎 编辑:程序博客网 时间:2024/06/05 11:52
来自牛客网的java笔试题:
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
评论解析扩展学习:
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块;
0 0
- java-finally块和return执行先后顺序
- java try语句块 finally和return 的执行顺序
- return finally的先后执行顺序
- finally return执行的先后顺序
- java中return和finally执行顺序
- Java return和finally执行顺序
- Java中finally块与return之间的执行顺序
- Java异常----try、catch和finally块中的return执行顺序
- try中return语句与finally块的执行先后
- java try return 和finally return 执行顺序证明
- Android面试之java基础try-catch-finally-return的执行先后顺序问题
- java中 有return 的情况,return以及try,finally代码块的执行顺序
- Java异常处理---finally和return的执行顺序
- Java中Return和Finally执行顺序的实现
- java中的return 语句和finally的执行顺序关系
- Java中Return和Finally执行顺序的实现
- Java中return和finally的执行顺序
- Java中,return和finally的执行顺序
- Unity判断一个物体是否在屏幕内外
- 第2章 人月神话
- FastDFS5.0.9基本安装配置
- nginx学习
- proteus第一个工程 流水灯实验
- java-finally块和return执行先后顺序
- 数据结构与算法(六)
- mysql 中的mysql数据库不见了
- crc32
- LeetCode109 Convert Sorted List to Binary Search Tree
- MySQL编程基础
- Android 用PopupWindow实现加载等待界面
- Application loader:ERROR ITMS-90168: "The binary you uploaded was invalid."
- LeetCode110 Balanced Binary Tree