Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱
MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina.com

异常 try catch finally return 执行关系 MD


目录

目录
探讨finally语句的执行与return的关系

探讨finally语句的执行与return的关系

Java异常捕获机制try...catch...finally块中的finally语句是不是一定会被执行?不一定,至少有两种情况下finally语句是不会被执行的:

  • try语句没有被执行到,如在try语句之前就返回了,这样finally语句就不会执行,这也说明了finally语句被执行的必要而非充分条件是:相应的try语句一定被执行到。
  • 在try块中有System.exit(0)这样的语句,System.exit(0)是终止Java虚拟机JVM的,连JVM都停止了,所有都结束了,当然finally语句也不会被执行到。

1、finally语句是在try的return语句执行之后,return返回之前执行的
测试案例:

public class TestFinally {public static void main(String[] args) {System.out.println(test());}public static String test() {try {System.out.println("try block");if (new Random().nextBoolean()) {return "直接返回";} else {return test2();}} finally {System.out.println("finally block");}}public static String test2() {System.out.println("return statement");return "调用方法返回";}
}

运行结果:

try block
finally block
直接返回

try block
return statement
finally block
调用方法返回

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

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

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

public class TestFinally {public static void main(String[] args) {System.out.println(test());}public static String test() {try {System.out.println("try block");return "在try中返回";} finally {System.out.println("finally block");return "在finally中返回";}// return "finally外面的return就变成不可到达语句,需要注释掉否则编译器报错";}
}

运行结果:

try block
finally block
在finally中返回

这说明finally里的return直接返回了,就不管try中是否还有返回语句。

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

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

public class TestFinally {public static void main(String[] args) {System.out.println(test());}public static int test() {int b = 20;try {System.out.println("try block");return b += 80;} finally {b += 10;System.out.println("finally block");}}
}

运行结果:

try block
finally block
100

测试用例2:

public class TestFinally {public static void main(String[] args) {System.out.println(test());}public static List<Integer> test() {List<Integer> list = new ArrayList<Integer>();list.add(10086);try {System.out.println("try block");return list;} finally {list.add(10088);System.out.println("finally block");}}
}

运行结果:

try block
finally block
[10086, 10088]

这其实就是Java到底是传值还是传址的问题了,简单来说就是:Java中只有传值没有传址。

这里大家可能又要想:是不是每次返回的一定是try中的return语句呢?那么finally外的return不是一点作用没吗?请看下面

4、try块里的return语句在异常的情况下不会被执行,这样具体返回哪个看情况

public class TestFinally {public static void main(String[] args) {System.out.println(test());}public static int test() {int b = 0;try {System.out.println("try block");b = b / 0;return b += 1;} catch (Exception e) {b += 10;System.out.println("catch block");} finally {b += 100;System.out.println("finally block");}return b;}
}

运行结果是:

try block
catch block
finally block
110

这里因 为在return之前发生了异常,所以try中的return不会被执行到,而是接着执行捕获异常的 catch 语句和最终的 finally 语句,此时两者对b的修改都影响了最终的返回值,这时最后的 return b 就起到作用了。

这里大家可能又有疑问:如果catch中有return语句呢?当然只有在异常的情况下才有可能会执行,那么是在 finally 之前就返回吗?看下面。

5、当发生异常后,catch中的return执行情况与未发生异常时try中return的执行情况完全一样

public class TestFinally {public static void main(String[] args) {System.out.println(test());}public static int test() {int b = 0;try {System.out.println("try block");b = b / 0;return b += 1;} catch (Exception e) {b += 10;System.out.println("catch block");return 10086;} finally {b += 100;System.out.println("finally block");}//return b;}
}

运行结果:

try block
catch block
finally block
10086

说明了发生异常后,catch中的return语句先执行,确定了返回值后再去执行finally块,执行完了catch再返回,也就是说情况与try中的return语句执行完全一样。

总结:

  • finally块的语句在try或catch中的return语句执行之后返回之前执行
  • 且finally里的修改语句可能影响也可能不影响try或catch中return已经确定的返回值
  • 若finally里也有return语句则覆盖try或catch中的return语句直接返回

2019-3-4

转载于:https://www.cnblogs.com/baiqiantao/p/10472137.html

异常 try catch finally return 执行关系 MD相关推荐

  1. try—catch—finally中,如果catch中return了,finally还会执行吗?

    1.如果catch中return了,finally还会执行吗 有异常 public class Test {public static void main(String[] args) {System ...

  2. Java中finally和return执行顺序

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

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

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

  4. try catch finally return的执行顺序与返回值探究

    下午看了一下百度文库中下载下来的java笔试题,其中一道就是关于这个问题的,所以写了个测试程序验证了一下,另外具体的理论知识搜罗了网上的资料. 测试程序如下: package com.andy.cod ...

  5. try catch和finally搭配return执行常见面试题讲解

    我们都知道,在Java中try.catch和finally常用来做异常处理,而且他们有执行顺序,即先执行try,如果try中没有异常,则执行完try语句块后执行finally语句块,如果try中有异常 ...

  6. try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗

    finally 一定会执行 try-catch-finally中return的执行情况: 在try中没有异常的情况下try.catch.finally的执行顺序 try --- finally 如果t ...

  7. 当try、catch中有return时,finally中的代码会执行么?

    今天,看到一个面试题: try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗? 我们用代码来验证下: public static void mai ...

  8. java try catch 异常后还会继续执行吗

    java try catch 异常后还会继续执行吗? catch 中如果你没有再抛出异常 , 那么catch之后的代码是可以继续执行的 , 但是try中 , 报错的那一行代码之后 一直到try结束为止 ...

  9. c++异常Try catch

    c++异常Try catch 分类: c++专区 功能函数测试集锦2014-04-09 17:43 1505人阅读 评论(0) 收藏 举报 一.简单的例子 首先通过一个简单的例子来熟悉C++ 的 tr ...

最新文章

  1. 使用jmeter测试java程序
  2. Training的第十六天
  3. ViewPagerIndicator+viewpager的简单使用,不需要导入Library包
  4. java servlet jsp javabean关系图,一个关于javaBean+servlet+jsp的MVC架构有关问题
  5. 美发新造型 名家创意示范集锦(图)
  6. 揭秘Harbor镜像仓库——首个源自中国的CNCF毕业项目
  7. 常见的MySQL命令大全
  8. 在mysql中字符串的操作_mysql中的字符串操作.doc
  9. 【数据库】sql2008卸载和默认实例的删除
  10. 用户画像标签体系建设指南
  11. 网络性能测试(系统层面、针对Linux、安卓)
  12. pe服务器注册表,在 win pe 下修改本机系统注册表
  13. C++基础算法 | 单调栈(Monotonous Stack)
  14. 推荐七个值得关注的公众号
  15. FastDFS作者余庆谈真正的开源精神
  16. “科林明伦杯”哈尔滨理工大学第十届程序设计竞赛
  17. abaqus钢结构螺栓连接分析
  18. OPC:客户端开发——应用WTclient.dll使用手册部分中文版
  19. 【Python实例学习】用户输入两个数字,并计算两个数字之和
  20. CS5261与CS5265功能应用|CS5261替代RTD2171|CS5265替代RTD2172

热门文章

  1. python项目打包部署到ios_Python的iOS自动化打包实例代码
  2. cudamemcpy运行速度很慢_只要设置好这几个选项,让你的 PS CC 2019 运行如飞
  3. 程序调用mysql突然变慢_排查Mysql突然变慢
  4. Ubuntu14.04系统下安装配置OpenCV 4.0.0开发环境全过程
  5. [深度学习] 自然语言处理 --- Huggingface-Pytorch中文语言Bert模型预训练
  6. RGB与YUV相互转换
  7. vasp 5.2编译方法
  8. 数据增强 数据集扩充_数据扩充的抽象总结
  9. C语言高级编程:extern用法
  10. TESTb需要向至少十几家应用商店提交上线审核,且每个应用商店要求的资料可能都不一样,异常繁琐