结论:

  • 不管有没有出现异常,finally代码块都会执行;
  • 不管try和catch的代码块中有return时,finally仍会执行,且如果finally代码块也有return,则此代码肯定会返回finally执行的return值。

如下分有return和没有return来讨论try-catch-finally执行顺序的情况:

1.无return时:

上代码:

     try {t1();t2();} catch (Exception e) {c();} finally {f();}m();

1.1 当try中的t1()没有抛出异常
因为没有捕捉到异常,那么执行try而不会执行catch,而finally无论如何都要执行。
其执行顺序为:t1() --> t2() --> f() --> m()

1.2 当try中的t1()抛出了异常
当 t1() 中抛出异常,那么 t1() 中从抛出异常的语句之后的代码以及 t2() 都不会执行, 程序会尝试捕捉异常。
捕捉Exception,捕捉成功,执行 c() ;
一旦捕捉到一个异常,不会再尝试捕捉其他异常,直接执行finally里的f();
执行后面的函数 m() 。
其执行顺序为:t1() --> c() --> f() --> m()

2.有return时

2.1:return在finally代码块后

     try{}catch(){}finally{}return;程序会按顺序执行

2.2:try代码块中有return

     try{return 1;}catch(){}finally{}return 2;

程序执行try块中return之前(包括return语句中的表达式运算)代码;
再执行finally块,最后执行try中return;
finally块之后的语句return不再执行,因为程序在try中已经return过了。
结论:得到try中的返回值1。

2.3 catch块中有return

     try{}catch(){return 1;}finally{}return 2;

程序先执行try,如果遇到异常执行catch块,

  • 有异常:执行catch中return之前(包括return语句中的表达式运算)代码,再执行finally语句中全部代码,最后执行catch块中return。 finally之后的return不再执行。
  • 无异常:执行完try再finally再return。
    结论:有异常影响catch,执行catch中的return得到返回值1。

2.4 try块和finally块中有return

     try{return 1;}catch(){}finally{return 2;}
  • 无异常:程序执行try块中return之前(包括return语句中的表达式运算)代码;再执行finally块,因为finally块中有return所以提前退出,而不再执行try中的return;
  • 有异常:不执行try,顺序执行catch-finally
    结论:得到finally中的返回值2。

2.5 catch块和finally块中有return

     try{}catch(){return 1;}finally{ return 2;}
  • 无异常:执行try后跳过catch执行finally;得到finally的返回值2;
  • 有异常:程序执行catch块中return之前(包括return语句中的表达式运算)代码;再执行finally块,因为finally块中有return所以提前退出。而不再执行catch中的return。
    结论:得到finally中的返回值2。

2.6 try块、catch块和finally块中有return

     try{return 1;}catch(){return 2;}finally{return 3;}

程序执行try块中return之前(包括return语句中的表达式运算)代码;

  • 无异常:然后再执行finally块,因为finally块中有return所以提前退出。
  • 有异常:执行catch块中return之前(包括return语句中的表达式运算)代码;再执行finally块,因为finally块中有return所以提前退出。
    结论:得到finally中的返回值3。

3 总结

无return,无异常

try ->finally

无return,有异常

try(未出现异常的前半段) -> catch ->finally

try或catch中有return,无异常

try -> finally ->return(try)

try或catch中有return,有异常

try(未出现异常的前半段) -> catch ->finally->return(catch)

只要是finally中有return的情况
不论有没有异常,try或catch中有没有return

try/catch->return(finally)

我们可以看出当finally中有return的时候,相当于此代码肯定会返回该值。

**

当 try-catch 块中有return 语句时,return 语句会暂存变量值,然后执行 finally 代码块。


public class ExceptionTest {int age;public static void main(String[] args) {System.out.println(test().age);}public static ExceptionTest test() {ExceptionTest test = new ExceptionTest();try {test.age = 10;return test;}catch (Exception e) {test.age = 20;return test;}finally {test = new ExceptionTest();test.age = 30;}}
}//输出10

JAVA异常中的坑--trytry-catch-finally的执行顺序相关推荐

  1. Java 异常中 e.getMessage() 和 e.toString() e.printStackTrace()的区别常见的几种异常

    Java 异常中 e.getMessage() 和 e.toString() e.printStackTrace()的区别 一.概述 在java异常体系中,要打印异常信息,可以通过:e.getMess ...

  2. 解析java异常中的finally关键字

    解析java异常中的finally关键字 1 含义 try-catch.finally里面的可选结构 2 作用 2.1 内容 finally声明的是一定会被执行的代码 2.2 遇到以下三种情况也还是会 ...

  3. java异常中的Error和Exception的区别是什么?

    java异常中的Error和Exception的区别是什么? 参考文章: (1)java异常中的Error和Exception的区别是什么? (2)https://www.cnblogs.com/Tr ...

  4. java异常中的finally(一)

    java异常中的finally(一) 参考文章: (1)java异常中的finally(一) (2)https://www.cnblogs.com/liaoxiaolao/p/9586134.html ...

  5. java 继承类 变量、静态变量、构造函数执行顺序

    java 继承类 变量.静态变量.构造函数执行顺序 Java代码   class C{ static int prt(int i){ System.out.println(i); return i; ...

  6. 事件循环中的宏任务和微任务执行顺序

    事件循环中的宏任务和微任务执行顺序 先来了解一下事件循环.宏任务.微任务和Promise 1.事件循环(Event Loop)运行机制 执行一个宏任务(栈中没有就从事件队列中获取) 执行过程中如果遇到 ...

  7. Java异常中受检异常非受检异常与RuntimeException异常关系

    Error 和 Exception: 所有异常都是 Throwable 的子类,分为 Error 和 Exception.Error 是 Java 运行时系统的内部错误和资 源耗尽错误,例如 Stac ...

  8. python try catch finally执行顺序_对python中的try、except、finally 执行顺序详解

    如下所示: def test1(): try: print('to do stuff') raise Exception('hehe') print('to return in try') retur ...

  9. 有return的情况下try catch finally的执行顺序

    前言,在写java 异常捕捉块的时候,有时候用到return,有时有各种情况,不仔细分析的化就会出现意想不到的问题,所以我测试一般情形,用于记录一下. 情景1:try{}catch{}finally{ ...

最新文章

  1. python调用zabbix api接口实时展示数据
  2. 同事间竞争,你该如何对待?
  3. linux tomcat 日志路径,linux日志文件在哪 linux安装tomcat
  4. 为什么要将对象序列化
  5. 最简易上手的numpy学习笔记四
  6. 实用的Portraiture滤镜磨皮教程
  7. ASP.NET读取自定义的config文件
  8. EDA技术实用教程 | 复习六 | 过程语句always
  9. Excel - 数组类型及数组公式
  10. 【Arduino】颜色识别的智能搬运机器人设计
  11. 国科大学习资料--高级软件工程-复习题设计题答案
  12. html清除iframe的缓存,如何清除iFrame的缓存?
  13. 关于大屏项目中分辨率和高宽比的总结
  14. (二)机器学习的流程概述,线性规划,图像分类
  15. 无分类编址CIDR(构造超网)
  16. 25,UC(04) .
  17. A man who has iron bone
  18. Libuv Timer定时器
  19. 总后台顶部实现站内信功能
  20. HX=JE,HX-JE芯片,无感4.9V升压ic电路图PDF应用技术

热门文章

  1. python 爬取24小时天气数据
  2. scrapy爬虫框架简绍与安装使用
  3. 教程:如何利用Google AIY做一个自动撵猫神器?
  4. 菜鸟教程mysql创建表_MySQL 创建数据库 | 菜鸟教程
  5. 用dos命令行执行java程序的方法
  6. 8个字符即可令Skype崩溃而且再也打不开
  7. 577. Employee Bonus
  8. 【无标题】python利用公式法计算圆周率
  9. JavaRIM实现(PRC的其中一种方案)
  10. springboot线程中获取bean