2019独角兽企业重金招聘Python工程师标准>>>

参考博文1:https://www.ibm.com/developerworks/cn/java/j-lo-finally/

参考博文2:http://www.cnblogs.com/lanxuezaipiao/p/3440471.html

网上有很多人探讨Java中异常捕获机制try...catch...finally块中的finally语句是不是一定会被执行?很多人都说不是,当然他们的回答是正确的,经过我试验,至少有两种情况下finally语句是不会被执行的:

(1)try语句没有被执行到,如在try语句之前就返回了,这样finally语句就不会执行,这也说明了finally语句被执行的必要而非充分条件是:相应的try语句一定被执行到。

(2)在try块中有System.exit(0);这样的语句,System.exit(0);是终止Java虚拟机JVM的,连JVM都停止了,所有都结束了,当然finally语句也不会被执行到。

1. finally语句在return语句执行之后return返回之前执行的。

当然还有很多人探讨Finally语句的执行与return的关系,颇为让人迷惑,不知道finally语句是在try的return之前执行还是之后执行?我也是一头雾水,我觉得他们的说法都不正确,我觉得应该是:finally语句是在try的return语句执行之后,return返回之前执行

public class FinallyTest1 {public static void main(String[] args) {System.out.println(test1());}public static int test1() {int b = 20;try {System.out.println("try block");return b += 80; }catch (Exception e) {System.out.println("catch block");}finally {System.out.println("finally block");if (b > 25) {System.out.println("b>25, b = " + b);}}return b;}}
try blockfinally block
b>25, b = 100
100

说明return语句已经执行了再去执行finally语句,不过并没有直接返回,而是等finally语句执行完了再返回结果。

如果觉得这个例子还不足以说明这个情况的话,下面再加个例子加强证明结论:

public class FinallyTest1 {public static void main(String[] args) {System.out.println(test11());}public static String test11() {try {System.out.println("try block");return test12();} finally {System.out.println("finally block");}}public static String test12() {System.out.println("return statement");return "after return";}}

运行结果为:

try blockreturn statement
finally block
after return

说明try中的return语句先执行了但并没有立即返回,等到finally执行结束后再

这里大家可能会想:如果finally里也有return语句,那么是不是就直接返回了,try中的return就不能返回了?看下面。

2. finally块中的return语句会覆盖try块中的return返回。

public class FinallyTest2 {public static void main(String[] args) {System.out.println(test2());}public static int test2() {int b = 20;try {System.out.println("try block");return b += 80;} catch (Exception e) {System.out.println("catch block");} finally {System.out.println("finally block");if (b > 25) {System.out.println("b>25, b = " + b);}return 200;}// return b;}}

运行结果是:

try blockfinally block
b>25, b = 100
200

这说明finally里的return直接返回了,就不管try中是否还有返回语句,这里还有个小细节需要注意,finally里加上return过后,finally外面的return b就变成不可到达语句了,也就是永远不能被执行到,所以需要注释掉否则编译器报错。

这里大家可能又想:如果finally里没有return语句,但修改了b的值,那么try中return返回的是修改后的值还是原值?看下面。

3. 如果finally语句中没有return语句覆盖返回值,那么原来的返回值可能因为finally里的修改而改变也可能不变。

转载于:https://my.oschina.net/u/2308739/blog/666488

java 中的finally 语句块执行顺序相关推荐

  1. Java 中 finally 与 return 的执行顺序详解

    java方法是在栈幀中执行,栈幀是线程私有栈的单位,执行方法的线程会为每一个方法分配一小块栈空间来作为该方法执行时的内存空间,栈幀分为三个区域: 1 . 操作数栈,用来保存正在执行的表达式中的操作数, ...

  2. java中子类继承父类程序执行顺序问题

    为什么80%的码农都做不了架构师?>>>    Java中,new一个类的对象,类里面的静态代码块.非静态代码.无参构造方法.有参构造方法.类的一般方法等部分,它们的执行顺序相对来说 ...

  3. java类初始化顺序_「漫画」Java中的父子类的执行顺序到底是怎么一回事?

    ----下课后---- 结论 类的加载顺序. (1) 父类静态代码块(包括静态初始化块,静态属性,但不包括静态方法) (2) 子类静态代码块(包括静态初始化块,静态属性,但不包括静态方法 ) (3) ...

  4. java中finally和return的执行顺序

    注意:return的位置... 从这几个例子中可以看到,如果try之前没有有条件的return,则try..catch..finally语句块中的语句都是顺序执行(如果try中或者catch中 有re ...

  5. 关于for循环中三个语句的执行顺序

    今天在书上看例子的时候,突然觉得对于for循环三个表达式的执行时间的理解还是很模糊,只知道在这里++i和i++的效果是一样的,而且前缀模式的效率更高,但是对于这一条表达式的是在本次循环开始前执行还是循 ...

  6. java子类代码块_java中父类子类静态代码块、构造代码块执行顺序

    父类静态(代码块,变量赋值二者按顺序执行) 子类静态 父类构造代码块 父类构造方法 子类构造代码块 子类构造方法 普通方法在实列调用的时候执行,肯定位于上面之后了 //父类A public class ...

  7. java代码块执行顺序_Java笔记 | Java代码块执行顺序测试

    最近笔试常常遇到考察Java代码块执行顺序的题目,网上查看博客错漏百出,特地自己测试了一下. 如有错漏,希望路过的大佬指出来,以便我进行更改. 先上代码吧! public class ClassA { ...

  8. oracle and和or的执行顺序,Oraclewhere语句中and,or,not的执行顺序

    Oracle where子句里面的and,or,not:1.a and b(顺序执行) (1)a,b同true则true, (2)a,b一false则false, [1]若a为 Oracle wher ...

  9. for循环中各语句的执行顺序

    for循环中各语句的执行顺序 初学编程的话,基本上是避不开for循环的.而作为一个很基本的知识点,我们就来梳理一下for循环中各语句的执行顺序! 首先我们来介绍一下for循环的基本形式 for(初始化 ...

最新文章

  1. php框架里有模版引擎吗,Yii框架用模版引擎了吗?_PHP开发框架教程
  2. Nginx平滑升级,并增加清除缓存模块
  3. Spring Boot 2.0(七):Spring Boot 如何解决项目启动时初始化资源
  4. 计算机网络实验第一周,新学期计算机网络实训报告范文
  5. 郑州尚新科技--J2EE考试题
  6. elasticsearch配置文件解析
  7. 如何让Latex公式字体变小
  8. socket编程学习笔记
  9. 《大数据》第2期“应用”——医疗健康大数据:应用实例与系统分析
  10. linux中如何设置用户自己的工作环境,Linux系统下设置用户登录环境
  11. xxx/labelKeypoint/utils/qt.py:81: RuntimeWarning: invalid value encountered in double_scalars
  12. 第三章:3.4 处理登陆的请求
  13. 移动通信发展史与5G技术的探索
  14. 3dmax计算机组装动画,3dmax怎么做动画,教你3dsmax动画制作流程和基本套路
  15. 通da信股本变迁gbbq权息文件解密
  16. 汉字Unicode表
  17. 解决电脑无法运行 Mscomctl.ocx控件 常见的4个问题
  18. 2021牛客寒假算法基础集训营4 F. 魏迟燕的自走棋
  19. Binding几种绑定方式
  20. js 获取当前年月日

热门文章

  1. kylin源码调试_Apache Kylin 命令注入漏洞调试分析(CVE-2020-1956)
  2. flutter 判断是不是调试模式_女人怎么判断男人是不是喜欢自己//男人真正喜欢女人的追求方式...
  3. Acrobat XI安装教程
  4. C语言 | 用51单片机实现公历与农历星期的转换(完整源代码)
  5. java 自定义注解获取_Java自定义注解
  6. java使用localstorage_sessionStorage和localStorage的使用
  7. 整理:C++中sprintf()函数的使用详解
  8. 电子科技大学研究生计算机与科学,川大和电子科技大学那个计算机考研专业好?...
  9. 出席全球数字经济大会 第四范式助力打造中国数字经济“北京样板”
  10. python3精要(23)-递归与函数列表