有return的情况下try catch finally的执行顺序
前言,在写java 异常捕捉块的时候,有时候用到return,有时有各种情况,不仔细分析的化就会出现意想不到的问题,所以我测试一般情形,用于记录一下。
情景1:try{}catch{}finally{}return 在这种情况下代码顺序执行
如:
package ming;public class Testt {public static int a() throws Exception{int a=0;try {System.out.println(1/0);} catch (Exception e) {e.printStackTrace();}finally {a=9;}return a;} //即使出现了异常,代码从上往下执行...不含糊public static void main(String[] args) throws Exception{int a = a();System.out.println(a);// 返回值为9}}
情景2:try{}catch{throw e;}finally{}return 如果在catch这个块把异常抛出去,此时你不能获取返回值。
如:
package ming;public class Testt {public static int a() throws Exception {int a = 0;try {System.out.println(1 / 0);} catch (Exception e) {throw new Exception(e);} finally {a = 9;}return a;}public static void main(String[] args) throws Exception {int a = a();System.out.println(a);//此时没有什么答案,仅仅抛出了一个异常而已,代码依然是从上往下执行}}
情景3:try{return}catch{}finally{}return 这样的结构其实最后的return 只是为了防止try语块没有返回值,如果try有返回值,最后finally 大括号后面的代码不会执行的。
执行流程也是从上往下,只是遇到了return 了,代码去执行finally的,然后返回try执行,最后finally后面的代码就不会去执行了,因为有返回值了。
如:
package ming;public class Testt {public static int a() throws Exception {int a = 0;try {a=1;return a;} catch (Exception e) {e.printStackTrace();} finally {a = 9;}a=10;//这代码是没有执行的return a;}public static void main(String[] args) throws Exception {int a = a();System.out.println(a);//输出1}}
情景4:try{return}catch{throw}finally{} 在返回值之前抛出异常,显然最后没有什么结果了
如:
package ming;public class Testt {public static int a() throws Exception {int a = 0;try {a=1;System.out.println(1/0);return a;} catch (Exception e) {throw new Exception(e);} finally {a = 9;}}public static void main(String[] args) throws Exception {int a = a();System.out.println(a);}}
情景4:try{return}catch{throw}finally{return} 在返回值之前抛出异常,finally 有return情况下,最后显然返回finally return的值了。
如:
package ming;public class Testt {public static int a() throws Exception {int a = 0;try {a=1;System.out.println(1/0);return a;} catch (Exception e) {throw new Exception(e);} finally {a = 9;return a;}}public static void main(String[] args) throws Exception {int a = a();System.out.println(a);//返回值为9}}
情景5:try{return}catch{return}finally{return} 依然以finally最后的return 作为返回值
如:
package ming;public class Testt {public static int a() throws Exception {int a = 0;try {a=1;System.out.println(1/0);return a;} catch (Exception e) {a=10;return a;} finally {a = 9;return a;}}public static void main(String[] args) throws Exception {int a = a();System.out.println(a);//返回值为9}}
情景6:try{return}catch{return}finally{} 如果try中异常返回catch中返回值,否则返回try中的
如:
package ming;public class Testt {public static int a() throws Exception {int a = 0;try {a=1;System.out.println(1/0);return a;} catch (Exception e) {a=10;return a;} finally {a = 9;}}public static void main(String[] args) throws Exception {int a = a();System.out.println(a);//返回10}}
情景7:我们把返回值类型改为对象类型测试一下:此时跟基本类型不一样,这是因为java 是值传递而不是引用传递
如:
package ming;public class Testt {public static Stu a() throws Exception {Stu stu=new Stu();try {stu.setName("张三");;return stu;} catch (Exception e) {} finally {stu.setName("李四");;}return stu;}public static void main(String[] args) throws Exception {Stu stu = a();System.out.println(stu.getName());//此时返回李四}}class Stu{private String name;public String getName() {return name;}public void setName(String name) {this.name = name;} }
总结一下:
1.不管有木有出现异常,finally块中代码都会执行;
2.当try和catch中有return时,finally仍然会执行,执行是try,如果有异常就执行catch,最后依然执行finally,即使有return,代码先忽视return,从上往下执行,然后返回代码try 或catch中的return。如果fianlly有return ,代码就不会执行try 或catch的return。
3.finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。
4.如果catch中抛出异常,你不会得到你的返回值。这在设计程序的时候要注意这个问题。
5. finally块的语句在try或catch中的return语句执行之后返回之前执行且finally里的修改语句可能影响也可能不影响try或catch中 return已经确定的返回值
可能影响也可能不影响指的是:因为java 是值传递而不是引用传递
参考:https://my.oschina.net/huluerwa/blog/311328
有return的情况下try catch finally的执行顺序相关推荐
- 各种有return的情况下try-catch-finally的执行顺序
结论: 1.不管有没有出现异常,finally块中代码都会执行: 2.当try和catch中有return时,finally仍然会执行: 3.finally是在return后面的表达式运算后执行的(此 ...
- 混合模式程序集是针对“v1.1.4322”版的执行时生成的,在没有配置其它信息的情况下,无法在 4.0 执行时中载入该程序集。...
看到一个kinect大牛编写的一个水果忍者的体感游戏版本号,让我为自己一直以来仅仅用现有的网页游戏来模拟kinect体感游戏控制感到羞愧,没办法.我还是菜鸟.学习一段后自己模仿星际大战这个游戏.自己写 ...
- try catch finally的执行顺序到底是怎样的?
首先执行try,如果有异常执行catch,无论如何都会执行finally 一个函数中肯定会执行finally中的部分. 关于一个函数的执行过程是,当有return以后,函数就会把这个数据存储在某个位置 ...
- python+appium多设备情况下指定设备,具体执行设备没按指定的来
问题 版本信息: 系统:windows 10 python : 3.6 appium : 1.22.3 (npm install -g appium安装) nodejs: v16.15.0 现象 主要 ...
- try,catch,finally的执行顺序问题
大家面试的时候想必会遇到这种面试题,要我们输出结果... 其实在实际的业务中呢一般都是用finally来关闭流的,很少做其它业务操作,所以呢大家也就容易忽视掉这个问题 首先在finally和try中对 ...
- Java中finally和return执行顺序
思考一个问题 Java异常捕获机制try-catch-finally块中的finally语句是否一定会被执行?起码在以下两种情况下是不会被执行的: 1.在try之前就返回了,try没有执行到. 2.t ...
- matlab lu分解 l不是下三角,在MATLAB中执行LU分解而不进行旋转
默认情况下,MATLAB的lu始终执行旋转.如果您在尝试执行传统的LU分解算法时,例如对角线系数等于0,则在执行高斯消元法创建上三角矩阵U时需要对角系数,因此无法工作除以零误差.需要旋转以确保分解稳定 ...
- 在多重Catch的情况下得到异常的完整信息
在方法多层调用的时候,每一层都有相应的catch处理后重新throw的情况下,刚开始在最外层无法得到产生异常的完整信息. 最初的代码样子如下: static void Main(string[] ar ...
- java switch配合return_关于Java switch语句:关于Java switch语句 – 在每种情况下使用return和省略break...
鉴于这种方法,这是否代表了一些令人震惊的风格或语义失误: private double translateSlider(int sliderVal) { switch (sliderVal) { ca ...
最新文章
- 大数据流处理:Flume、Kafka和NiFi对比
- Google今天的logo
- 分享jQuery对象和Javascript对象之间的转换代码
- selenium之 chromedriver版本对照表
- 打开My Lead detail page会发生timeout的错误的解决方案
- aqlserver实用程序_sqlserver命令提示实用工具的介绍
- RUNOOB python练习题27 递归逆向输出字符串
- MVC传递Model
- 国潮国粹剪纸风京剧人物PSD素材,让东方韵味更浓
- ue4 点击启动_4399游戏2020届校招启动
- 华为开发者学堂 | 囤课畅学 码住未来
- android 布局如何居中,Android ConstraintLayout约束布局的居中详解
- 香港公司章程中英文样本
- Unity入门——UI界面
- 图书馆座位预约系统管理/基于微信小程序的图书馆座位预约系统
- SQLServer iif函数
- V2新品来袭 | 简约之选 无限可能
- 处理 Exception 的几种实践,被很多团队采纳!
- 中国软件服务外包IT公司最新排名-IT外包最强前50名
- 如何去掉行首行尾的空格