在实际的编码过程中,我们有时希望一部分 try 块中的代码无论是否抛出异常,它们都能得到执行,如释放打开的文件、关闭网络链接等。

在 try-catch 后面加上 finally ,可以实现这个效果,无论异常是否被抛出,finally 块中的语句都会执行。

public class FinallyWorks {public static void f() throws Exception {throw new Exception("throw exception");}public static void main(String[] args) {try {f();System.out.println("no exception");} catch (Exception e) {System.out.println("caught exception");} finally {System.out.println("In finally clause");}}}
caught exception
In finally clause

假设在 finally 之前进行了 return 操作, finally 中的代码还能执行嘛?

public class MultipleReturns {public static void f(int i) {System.out.println("Initialization that requires cleanup");try {System.out.println("Point 1");if (i == 1) return;System.out.println("Point 2");if (i == 2) return;System.out.println("Point 3");if (i == 3) return;} finally {System.out.println("Performing cleanup");}}public static void main(String[] args) {for (int i = 0; i < 4; i++) {f(i);}}}
Initialization that requires cleanup
Point 1
Point 2
Point 3
Performing cleanup
Initialization that requires cleanup
Point 1
Performing cleanup
Initialization that requires cleanup
Point 1
Point 2
Performing cleanup
Initialization that requires cleanup
Point 1
Point 2
Point 3
Performing cleanupProcess finished with exit code 0

由上述例子可见,无论在哪个点执行 return ,finally 中的代码都得到了执行。

但遗憾的时,如果 finally 使用不恰当,会造成异常丢失。比如下面这个例子:

public class VeryImportantException extends Exception {@Overridepublic String toString() {return "A very important exception!";}}
public class HoHumException extends Exception {@Overridepublic String toString() {return "A trivial exception";}}
public class LostMessage {public void f() throws VeryImportantException {throw new VeryImportantException();}public void dispose() throws HoHumException {throw new HoHumException();}public static void main(String[] args) {LostMessage lostMessage = new LostMessage();try {try {lostMessage.f();} finally {lostMessage.dispose();}} catch (Exception e) {System.out.println(e);}}}
A trivial exception

VeryImportantException 被 finally 中的 HoHumException 所取代,应当尽力避免这种使用方式。

除此之外,还有一种各位简单的异常丢失方式:

public class ExceptionSilencer {public static void main(String[] args) {try {throw new RuntimeException();} finally {return;}}}

在 finally 中使用 return 会造成异常的丢失。

本次分享至此结束,希望本文对你有所帮助,若能点亮下方的点赞按钮,在下感激不尽,谢谢您的【精神支持】。

若有任何疑问,也欢迎与我交流,若存在不足之处,也欢迎各位指正!

使用finally进行清理 -- 《JAVA编程思想》37相关推荐

  1. 《JAVA编程思想》学习笔记:第8章(多态)

    目录 Java编程思想(一)第1~4章:概述 Java编程思想(二)第5章:初始化和清理 Java编程思想(三)第6章:访问权限 Java编程思想(四)第7章:复用类 Java编程思想(五)第8章:多 ...

  2. 《JAVA编程思想》学习笔记:第16章(数组)

    目录 Java编程思想(一)第1~4章:概述 Java编程思想(二)第5章:初始化和清理 Java编程思想(三)第6章:访问权限 Java编程思想(四)第7章:复用类 Java编程思想(五)第8章:多 ...

  3. 《JAVA编程思想》学习笔记:第1-4章(Java概述)

    全书目录 Java编程思想(一)第1~4章:概述 Java编程思想(二)第5章:初始化和清理 Java编程思想(三)第6章:访问权限 Java编程思想(四)第7章:复用类 Java编程思想(五)第8章 ...

  4. 《JAVA编程思想》学习笔记:第21章(并发)

    目录 Java编程思想(一)第1~4章:概述 Java编程思想(二)第5章:初始化和清理 Java编程思想(三)第6章:访问权限 Java编程思想(四)第7章:复用类 Java编程思想(五)第8章:多 ...

  5. 《JAVA编程思想》学习笔记:第19章(枚举)

    目录 Java编程思想(一)第1~4章:概述 Java编程思想(二)第5章:初始化和清理 Java编程思想(三)第6章:访问权限 Java编程思想(四)第7章:复用类 Java编程思想(五)第8章:多 ...

  6. 《Java编程思想》学习笔记(三)——初始化与清理

    一.初始化 初始化其实就是为变量分配内存空间,并确定其初始值的过程.想了解Java中初始化的各种情况,首先要了解Java中变量的类型.根据自己的理解,将Java中的变量类型分成以下几种,虽然可能不太准 ...

  7. java 析构函数_《JAVA编程思想》5分钟速成:第5章(初始化和清理)

    第五章.初始化和清理 前言 1.初始化顺序(静态成员.非静态成员,构造器.父类构造器)的排序: 2.构造器(constructor)是否可被重写(override)? 3.final, finally ...

  8. 《Java编程思想》读书笔记01-初始化与清理

    开篇 最近在看Java编程思想,想把Java SE部分重新巩固一下.由于之前看过两遍遍<Java疯狂讲义>,但是看过以后很多东西就忘记了,所以想记录一下学习Java SE的过程与重点.初步 ...

  9. 【java】《java编程思想》 读书笔记

    之前主要用的C++的比较多,之前花了快2个月的实际认真系统全面的学习了以下java的基础语法,<java编程思想>这本书翻译水平确实不是很好,很多话读着会比较拗口.推荐读之前,先去网上搜索 ...

  10. Java编程思想日志

    Thinking In Java的作者是大牛!做事要站在巨人的肩膀上有助于提高效率和开阔眼界!建议学习java的小伙伴儿有时间可以抽空了解一下,以下内容为读书笔记,比较杂乱,仅供参考,推荐阅读原著: ...

最新文章

  1. erlang精要(16)-匿名函数之sigmoid函数实现
  2. MailBee.NET Objects发送电子邮件(SMTP)教程六:创建并发送带有附件的邮件
  3. post 请求 argument type mismatch_Flask-RESTful 请求解析
  4. python server酱_Python使用微信收取通知
  5. c#语言程序设计上机实验,《C#语言程序设计》实 验 报 告
  6. conda 环境迁移
  7. 47. PHP 魔术方法
  8. js之table操作
  9. 体外诊断(IVD)行业系列四:快速崛起的独立医学实验室
  10. Linux C语言编程学习材料
  11. 计算机i网络管理员证书四级,软考网络管理员试题练习(4)
  12. ATeam社区(牛客网项目第七章)
  13. 英伟达创始人出生 | 历史上的今天
  14. HTML无序列表四大名著
  15. H5 查看大图。缩放图片
  16. python 图灵完备_图灵完备到底是个什么鬼?
  17. Pokémon Army (easy version)
  18. java 提取违反顺序_oracle 中 java.sql.SQLException: ORA-01002: 提取违反顺序
  19. win10家庭版调出组策略_正版Win10免费送!这绝对是全网最低价的正版Win10系统
  20. 深度学习电脑配置推荐

热门文章

  1. 如何在ppt中生成柱状图_ppt中制作的柱状图只有4个柱子如何增加到8个柱子?
  2. 中高层执行力提升——吴湘洪老师
  3. 爱奇艺、优酷、腾讯视频 限制设备登录 唯一登录设计原理
  4. 涉密信息系统建设管理
  5. 经典中的经典之——筛选法求素数(埃氏筛 | 线性筛)
  6. 【app】1.2 悬浮窗_移动
  7. 屏蔽Settings里面连续五次点击版本号打开开发者模式,并且通过计算器暗码来打开开发者模式
  8. 生动形象的理解API是如何工作的!
  9. python、pycharm、anaconda区别
  10. ug894 中文文档 | Xilinx