●传统用法
try-catch-finally大家都会用:try包裹可能抛出异常的代码;catch捕获异常并对其处理;finally做一些资源关闭等回收工作。简单明了一句话就能说清。

稍微进阶一些的,大家可能在笔试/面试/工作中遇到,如果try、catch中有了return,那finally的执行时在return之前还是return之后呢?我们查看java官方的说明可以得到答案:

If the try clause executes a return, the compiled code does the following:

Saves the return value (if any) in a local variable.
Executes a jsr to the code for the finally clause.
Upon return from the finally clause, returns the value saved in the local variable.
翻译一下:

如果try块中有return,代码会做以下工作:

1、将return的值保存在一个本地变量中;

2、执行finally块中的Java Specification Requests(jsr,java标准提案)代码;

3、执行完finally块后(从finally中返回后),return刚才保存在本地变量中的值。

解读一下,我们能从中得出以下结论:

1、try、catch和finally中都可以有return;

2、try或者catch(二者层次相同,正常逻辑与异常逻辑,因此可以如此推断,当然也可以验证)中return的值会先保存起来;

3、finally中执行完代码后(此处jsr笔者不是很理解,暂视为正常的java代码),无论对第2步中的返回值是否有修改,返回的均是第2步保存的内容。

●特殊妙用
根据前一部分的知识,我们可以进行如下的使用。结合这么一个需求:一个函数返回某个集合,并把该集合清空,以备其他操作该集合的对象能重新写入数据。一般业务场景可能是需要定期读取集合/内存/缓存中的数据,并把读过的数据删除,已防止集合/内存/缓存撑爆。

如果对finnaly不是很熟悉,可能会写出这样的代码:

public class Demo {
  public static final List<String> stringList = new ArrayList<>();
 
  public List<String> getAndClear(){
    List<String> result = new ArrayList<>(stringList);
    stringList.clear();
    return result;
  }
}
因为无法在return之后执行代码,因此考虑生成一个新的集合,把原集合清空,返回新集合。这么做不优雅之处在于手动实例化了一个新的对象。

但如果我们用finally来做,就不需要自己去实例化新对象了:

public class Demo {
  public static final List<String> stringList = new ArrayList<>();
 
  public List<String> getAndClear(){
   try{
     return stringList;
   }
   finally {
     stringList.clear();
   }
  }
}
以上就是finnaly的一个妙用,主要是理解try-catch中用了return,代码的执行顺序已经数据变更。

finally的一个妙用的更多相关文章

  1. 使用val()另一个妙用------选中select/checkbox/radio的值

    一直认为val()方法只有两个功能:1.能设置元素的值,2.获取元素的值.知道val()方法还有另外一个妙用,就是它能使select(下拉列表框).checkbox(多选框)和radio(单选框)相应 ...

  2. 关于Go语言,自己定义结构体标签的一个妙用.

    在Go中首字母大写和小写,决定着这此变量能否被外部调用, 比如:在使用标准库的json编码自定一的结构的时候: <pre style="margin-top: 0px; margin- ...

  3. 使用docker 解决一个小问题,你也可能用的到

    以前一直觉得docker是运维用的工具,或者devops 用的工具,一般人应该用不上,直到最近发现docker 还有另外一个妙用,不管是什么语言. 这几天开会网络特别不好,nodejs npm 仓库 ...

  4. C++11实现一个轻量级的AOP框架

    AOP介绍 AOP(Aspect-Oriented Programming,面向方面编程),可以解决面向对象编程中的一些问题,是OOP的一种有益补充.面向对象编程中的继承是一种从上而下的关系,不适合定 ...

  5. [转]J-Link Commander的妙用

    转自http://maker.zlgmcu.com/portal.php?mod=view&aid=3685 J-Link Commander作为J-Link驱动软件包的一个工具之一,为工程师 ...

  6. 学习 shell脚本之前的基础知识

    转载自:http://www.92csz.com/study/linux/12.htm  学习 shell脚本之前的基础知识 日常的linux系统管理工作中必不可少的就是shell脚本,如果不会写sh ...

  7. Shell编程菜鸟基础入门笔记

    Shell编程基础入门     1.shell格式:例 shell脚本开发习惯 1.指定解释器 #!/bin/bash 2.脚本开头加版权等信息如:#DATE:时间,#author(作者)#mail: ...

  8. CSS图片裁剪Clip

    CSS Clip 裁剪 可以用它来裁剪一张图片噢. 我们来裁剪一下Google图标,把G字给裁剪下来. 注意这个clip得配合绝对定位才能使用,不然不起效果. rect (top, right, bo ...

  9. PowerShell脚本:随机密码生成器

    脚本名称:s随机密码生成器_v2.63.ps1脚本作用:产生随机密码.每密码字符个数,密码数量,存盘位置等可以自定义.脚本用法:脚本采用了硬编码,所以你需要打开脚本,修改如下变量:$生成密码总个数 = ...

随机推荐

  1. C++ STL用法总结(持续更新)

    Vector 动态数组 https://www.cnblogs.com/zhonghuasong/p/5975979.html lower_bound&&upper_bound htt ...

  2. python之输入一系列整数输出最大值

    在python学习中,我们经常会遇到:编写一个程序,输入若干整数或者是在一串字符中,输出最大值(数)的问题.那么在这里,我给出了几种常见的,也是几种比较常用的方法,希望能给大家的学习带来一定的帮助. ...

  3. centos7---ansible批量部署

    CentOS7系统 ansible自动化部署多台服务器部署   Ansible工作机制  从图中可以看出ansible分为以下几个部份: 1> Control Node:控制机器2> In ...

  4. Spark 源码和应用开发环境的构建

    引言 Spark 现在无疑是大数据领域最热门的技术之一,读者很容易搜索到介绍如何应用 Spark 技术的文章,但是作为开发人员,在了解了应用的概念之后,更习惯的是打开开发环境,开发一些应用来更深入的学 ...

  5. 导入java web项目时 web.xml第一行报错

    报错信息: Referenced file contains errors (http://java.sun.com/xml/ns/j2ee/j2ee_1_4.xsd). For more infor ...

  6. 嵌套For循环性能优化

    请对以下的代码进行优化 for (int i = 0; i < 1000; i++) for (int j = 0; j < 100; j++) for (int k = 0; k < ...

  7. JAVA语言程序设计课后习题----第五单元解析(仅供参考)

    1 本题是水题,题目要求你求最大值.最小值,建议你用Arrays.sort函数进行排序,最大值.最小值就可以确定了 import java.util.Arrays; import java.util. ...

  8. 第三篇.python编辑器和集成环境01

    修改python的镜像源 使用pip可以提高网速 \Lib\site-packages\pip\models\index.py文件,将PYPI的值改为你所需要的镜像源即可,例如改为豆瓣镜像源: #Py ...

  9. SDK更新失败问题解决

    环境:1. win102. Have over fire wall 解决办法:1.启动 Android SDK Manager ,打开主界面,依次选择「Tools」.「Options...」,弹出『A ...

  10. 【构造 meet in middle 随机 矩阵树定理】#75. 【UR #6】智商锁

    没智商了 变式可见:[构造 思维题]7.12道路建设 当你自信满满地把你认为的正确密码输入后,时光机滴滴报警 —— 密码错误.你摊坐在了地上. 黑衣人满意地拍了拍你的肩膀:“小伙子,不错嘛.虽然没解开 ...