Java 7中的 try-with-resource,在没有这个语法糖的情况下的等价实现是什么?

以下面的demo为例,这个问题目测99%的人都写不完全正确,不信来战。

public static void foo() throws Exception {

try (AutoCloseable c = dummy()) {

bar();

}

}

public static void bar() {

// may throw exception

}

我们凭第一感觉来写一下:

public static void foo() throws Exception {

AutoCloseable c = null;

try {

c = dummy();

bar();

} finally {

if (c != null) {

c.close();

}

}

}

看起来没什么问题,但是仔细想一下,如果bar()抛出了异常e1,c.close()也抛出了异常e2,调用者会收到哪个呢?

我们来回顾一下Java基础,try catch finally部分

public static void foo() {

try {

throw new RuntimeException("in try");

} finally {

throw new RuntimeException("in finally");

}

}

调用foo()函数最终会抛出什么异常呢?

运行一下:

Exception in thread "main" java.lang.RuntimeException: in finally

try中抛出的异常,就被finally中抛出的异常淹没掉了。

回到刚刚的问题,如果 bar() 和 c.close()同时抛了异常,那么调用端应该会收到c.close()抛出的异常e2, 往往这并不是我们想要的。那么怎么样抛出try中的异常,同时又不丢掉finally中的异常呢?

Java 7 中 为 Throwable 类 增 加 的 addSuppressed 方 法。当 一 个异 常 被 抛 出 的 时 候 , 可 能 有 其 他 异 常 因 为 该 异 常 而 被 抑 制 住 , 从 而 无 法 正 常 抛 出 。 这时 可 以 通 过addSuppressed 方 法 把 这 些 被 抑 制 的 方 法 记 录 下 来 。 被 抑 制 的 异 常 会 出 现在 抛 出 的 异 常 的 堆 栈 信 息 中 , 也 可 以 通 过 getSuppressed 方 法 来 获 取 这 些 异 常 。 这 样做 的 好 处 是 不 会 丢 失 任 何 异 常 , 方 便 开 发 人 员 进 行 调 试 。

有了上述概念,我们进行改写

```java

public static void foo() throws Exception {

AutoCloseable c = null;

Exception tmpException = null;

try {

c = dummy();

bar();

} catch (Exception e) {

tmpException = e;

throw e;

} finally {

if (c != null) {

if (tmpException != null) {

try {

java try resource_从 Java 字节码角度看 try with resource 语法糖相关推荐

  1. 深入浅出Java复用类【从字节码角度看toString调用机制、对象代理、组合与继承、转型、final、初始化】

    这个世界上有10种人:一种是懂二进制的,一种是不懂二进制的 你觉得类是在什么时候被加载的?[访问static域时,为什么?看完9就明白了] 文章目录 1.深入理解Java中toString方法的调用机 ...

  2. Java字节码角度分析方法调用 ——提升硬实力7

    在前面的文章中,有详细地介绍java字节码相关的知识,有兴趣的可以提前了解一下. 1.Java字节码的一段旅行经历--提升硬实力1 2.Java字节码角度分析a++ --提升硬实力2 3.Java字节 ...

  3. 从JDK源码角度看Long

    概况 Java的Long类主要的作用就是对基本类型long进行封装,提供了一些处理long类型的方法,比如long到String类型的转换方法或String类型到long类型的转换方法,当然也包含与其 ...

  4. 从JDK源码角度看Short

    概况 Java的Short类主要的作用就是对基本类型short进行封装,提供了一些处理short类型的方法,比如short到String类型的转换方法或String类型到short类型的转换方法,当然 ...

  5. java异常 字节码,Java字节码角度分析异常处理

    目录 从字节码角度来分析:异常处理 1.1 异常-catch // 从字节码角度来分析:异常处理 public class T13_ByteAnalyseException { public stat ...

  6. Java字节码角度分析多态原理 ——提升硬实力8

    在前面的文章中,有详细地介绍java字节码相关的知识,有兴趣的可以提前了解一下. 1.Java字节码的一段旅行经历--提升硬实力1 2.Java字节码角度分析a++ --提升硬实力2 3.Java字节 ...

  7. Java字节码角度分析:Synchronized ——提升硬实力11

    在前面的文章中,有详细地介绍java字节码相关的知识,有兴趣的可以提前了解一下. 1.Java字节码的一段旅行经历--提升硬实力1 2.Java字节码角度分析a++ --提升硬实力2 3.Java字节 ...

  8. 【Java 虚拟机原理】Class 字节码二进制文件分析 七 ( 局部变量表分析 )

    文章目录 前言 一.编译生成带局部变量表的字节码文件 二.局部变量表 前言 上一篇博客 [Java 虚拟机原理]Class 字节码二进制文件分析 二 ( 常量池位置 | 常量池结构 | tag | i ...

  9. 【Java 虚拟机原理】Class 字节码二进制文件分析 六 ( 属性类型 | Code 属性 | 属性名称索引 | 属性长度 | 操作数栈最大深度 | 局部变量存储空间 | 字节码长度 )

    文章目录 前言 一.属性类型 二.Code 属性表数据结构 三.属性名称索引 四.属性长度 五.操作数栈最大深度 六.局部变量存储空间 七.字节码长度 八.存储字节码指令的一系列字节流 前言 上一篇博 ...

最新文章

  1. Python中的Optional和带默认值的参数
  2. Mysql select into outfile NULL值导出的处理方法
  3. 2020ICPC(小米邀请赛2) - Knapsack(贪心+dp)
  4. ubuntu设置静态ip
  5. WPF开发的实用小工具 - 快捷悬浮菜单
  6. Apache Spark开发介绍
  7. 英伟达与 ARM 初携手,英国共建 AI 研究中心
  8. iterator 怎么使用甀_Iterator的使用
  9. 路径 @/ ~/ / ./ ../
  10. 搜索引擎中影响索引长度的因素
  11. 再见2006,奋斗2007
  12. OpenGL ES 绘制纹理
  13. entity framework 新手入门篇(1.5)-lambda表达式与linq
  14. 智慧灯杆解决方案之智慧景区建设
  15. 【论文】360-aware saliency estimation with conventional image saliency predictors阅读笔记
  16. Win10应用程序添加到右键中
  17. “宅经济”催化下的泛娱乐行业,未来将引爆哪些增长点?
  18. Kafka中zookeeper的作用详解(7点)
  19. 孤独的灵魂 - 复旦投毒案
  20. 《元宇宙2086》亮相金鸡奖中国首部元宇宙概念院线电影启动

热门文章

  1. 计算机网络运输层习题5-13
  2. Java基本语法——(用于日后复习)
  3. 修改CentOS 7.2系统的主机名
  4. hdu1166敌兵布阵hdu1754I Hate It(线段树入门)
  5. free malloc
  6. C#-Home / 详解Asp.Net Sql数据库连接字符串
  7. FCKeditor 2.6 安装配置使用指南(asp)
  8. UA PHYS515 电磁理论I 麦克斯韦方程组基础3 麦克斯韦方程的势能形式
  9. 图解修改Windows启动菜单命令行工具BCDEdit
  10. opencv图像识别