JAVA异常中的坑--trytry-catch-finally的执行顺序
结论:
- 不管有没有出现异常,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的执行顺序相关推荐
- Java 异常中 e.getMessage() 和 e.toString() e.printStackTrace()的区别常见的几种异常
Java 异常中 e.getMessage() 和 e.toString() e.printStackTrace()的区别 一.概述 在java异常体系中,要打印异常信息,可以通过:e.getMess ...
- 解析java异常中的finally关键字
解析java异常中的finally关键字 1 含义 try-catch.finally里面的可选结构 2 作用 2.1 内容 finally声明的是一定会被执行的代码 2.2 遇到以下三种情况也还是会 ...
- java异常中的Error和Exception的区别是什么?
java异常中的Error和Exception的区别是什么? 参考文章: (1)java异常中的Error和Exception的区别是什么? (2)https://www.cnblogs.com/Tr ...
- java异常中的finally(一)
java异常中的finally(一) 参考文章: (1)java异常中的finally(一) (2)https://www.cnblogs.com/liaoxiaolao/p/9586134.html ...
- java 继承类 变量、静态变量、构造函数执行顺序
java 继承类 变量.静态变量.构造函数执行顺序 Java代码 class C{ static int prt(int i){ System.out.println(i); return i; ...
- 事件循环中的宏任务和微任务执行顺序
事件循环中的宏任务和微任务执行顺序 先来了解一下事件循环.宏任务.微任务和Promise 1.事件循环(Event Loop)运行机制 执行一个宏任务(栈中没有就从事件队列中获取) 执行过程中如果遇到 ...
- Java异常中受检异常非受检异常与RuntimeException异常关系
Error 和 Exception: 所有异常都是 Throwable 的子类,分为 Error 和 Exception.Error 是 Java 运行时系统的内部错误和资 源耗尽错误,例如 Stac ...
- python try catch finally执行顺序_对python中的try、except、finally 执行顺序详解
如下所示: def test1(): try: print('to do stuff') raise Exception('hehe') print('to return in try') retur ...
- 有return的情况下try catch finally的执行顺序
前言,在写java 异常捕捉块的时候,有时候用到return,有时有各种情况,不仔细分析的化就会出现意想不到的问题,所以我测试一般情形,用于记录一下. 情景1:try{}catch{}finally{ ...
最新文章
- python调用zabbix api接口实时展示数据
- 同事间竞争,你该如何对待?
- linux tomcat 日志路径,linux日志文件在哪 linux安装tomcat
- 为什么要将对象序列化
- 最简易上手的numpy学习笔记四
- 实用的Portraiture滤镜磨皮教程
- ASP.NET读取自定义的config文件
- EDA技术实用教程 | 复习六 | 过程语句always
- Excel - 数组类型及数组公式
- 【Arduino】颜色识别的智能搬运机器人设计
- 国科大学习资料--高级软件工程-复习题设计题答案
- html清除iframe的缓存,如何清除iFrame的缓存?
- 关于大屏项目中分辨率和高宽比的总结
- (二)机器学习的流程概述,线性规划,图像分类
- 无分类编址CIDR(构造超网)
- 25,UC(04) .
- A man who has iron bone
- Libuv Timer定时器
- 总后台顶部实现站内信功能
- HX=JE,HX-JE芯片,无感4.9V升压ic电路图PDF应用技术