前言,在写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的执行顺序相关推荐

  1. 各种有return的情况下try-catch-finally的执行顺序

    结论: 1.不管有没有出现异常,finally块中代码都会执行: 2.当try和catch中有return时,finally仍然会执行: 3.finally是在return后面的表达式运算后执行的(此 ...

  2. 混合模式程序集是针对“v1.1.4322”版的执行时生成的,在没有配置其它信息的情况下,无法在 4.0 执行时中载入该程序集。...

    看到一个kinect大牛编写的一个水果忍者的体感游戏版本号,让我为自己一直以来仅仅用现有的网页游戏来模拟kinect体感游戏控制感到羞愧,没办法.我还是菜鸟.学习一段后自己模仿星际大战这个游戏.自己写 ...

  3. try catch finally的执行顺序到底是怎样的?

    首先执行try,如果有异常执行catch,无论如何都会执行finally 一个函数中肯定会执行finally中的部分. 关于一个函数的执行过程是,当有return以后,函数就会把这个数据存储在某个位置 ...

  4. python+appium多设备情况下指定设备,具体执行设备没按指定的来

    问题 版本信息: 系统:windows 10 python : 3.6 appium : 1.22.3 (npm install -g appium安装) nodejs: v16.15.0 现象 主要 ...

  5. try,catch,finally的执行顺序问题

    大家面试的时候想必会遇到这种面试题,要我们输出结果... 其实在实际的业务中呢一般都是用finally来关闭流的,很少做其它业务操作,所以呢大家也就容易忽视掉这个问题 首先在finally和try中对 ...

  6. Java中finally和return执行顺序

    思考一个问题 Java异常捕获机制try-catch-finally块中的finally语句是否一定会被执行?起码在以下两种情况下是不会被执行的: 1.在try之前就返回了,try没有执行到. 2.t ...

  7. matlab lu分解 l不是下三角,在MATLAB中执行LU分解而不进行旋转

    默认情况下,MATLAB的lu始终执行旋转.如果您在尝试执行传统的LU分解算法时,例如对角线系数等于0,则在执行高斯消元法创建上三角矩阵U时需要对角系数,因此无法工作除以零误差.需要旋转以确保分解稳定 ...

  8. 在多重Catch的情况下得到异常的完整信息

    在方法多层调用的时候,每一层都有相应的catch处理后重新throw的情况下,刚开始在最外层无法得到产生异常的完整信息. 最初的代码样子如下: static void Main(string[] ar ...

  9. java switch配合return_关于Java switch语句:关于Java switch语句 – 在每种情况下使用return和省略break...

    鉴于这种方法,这是否代表了一些令人震惊的风格或语义失误: private double translateSlider(int sliderVal) { switch (sliderVal) { ca ...

最新文章

  1. 大数据流处理:Flume、Kafka和NiFi对比
  2. Google今天的logo
  3. 分享jQuery对象和Javascript对象之间的转换代码
  4. selenium之 chromedriver版本对照表
  5. 打开My Lead detail page会发生timeout的错误的解决方案
  6. aqlserver实用程序_sqlserver命令提示实用工具的介绍
  7. RUNOOB python练习题27 递归逆向输出字符串
  8. MVC传递Model
  9. 国潮国粹剪纸风京剧人物PSD素材,让东方韵味更浓
  10. ue4 点击启动_4399游戏2020届校招启动
  11. 华为开发者学堂 | 囤课畅学 码住未来
  12. android 布局如何居中,Android ConstraintLayout约束布局的居中详解
  13. 香港公司章程中英文样本
  14. Unity入门——UI界面
  15. 图书馆座位预约系统管理/基于微信小程序的图书馆座位预约系统
  16. SQLServer iif函数
  17. V2新品来袭 | 简约之选 无限可能
  18. 处理 Exception 的几种实践,被很多团队采纳!
  19. 中国软件服务外包IT公司最新排名-IT外包最强前50名
  20. 如何去掉行首行尾的空格

热门文章

  1. Android: Custom View和include标签的区别
  2. Android 动画汇总-自定义动画
  3. 非对称加密,我终于理解了!
  4. 表的垂直拆分和水平拆分
  5. Oracle——20数据库恢复与备份
  6. Teradata join 优化
  7. 使用xilinx的documentation navigator快速查找资料
  8. XPath 读书笔记
  9. 吉他谱——再回首pic
  10. C++编程题,开心的小明