先了解几个背景知识

  • 什么是语法糖

    • 语法糖是在语言中增加的某种语法,在不影响功能的情况下为程序员提供更方便的使用方式。
  • 什么是资源

    • 使用之后需要释放或者回收的都可以称为资源,比如JDBC的connection连接,文件IO的各种类。
    • 在这里我们可以简单理解为实现了  java.lang.AutoCloseable/java.io.Closeable接口的类对象。

回到正题,try-with-resources是什么?

  • 是java的一个语法糖,在try语句中声明一个或者多个资源。

哪些资源可以用于try-with-resources呢?

  • 实现了 java.lang.AutoCloseable/java.io.Closeable 的类对象

现在如果不用try-with-resources我需要怎么实现代码?

package testReadFile;import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;public class ReadFile {public static void main(String[] args) {BufferedReader reader = null;String buffer = null;try {reader = new BufferedReader(new FileReader("src/testRead.txt"));do {buffer = reader.readLine();System.out.println(buffer);} while (reader.read() != -1);} catch (IOException e) {e.printStackTrace();} finally {try {// 问题一:需要显示的调用close,也要对close再加一层try catch 还有个问题是// 问题二:close函数也有可能抛异常,如果这里抛出异常,try块里面的异常信息就会被丢弃
                reader.close();} catch (IOException e) {e.printStackTrace();}}}
}

使用try-with-resources的实现

package testReadFile;import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;public class ReadFile {public static void main(String[] args) {String bufferSugar = null;try (BufferedReader readerSugar = new BufferedReader(new FileReader("src/testRead.txt"))) {bufferSugar = readerSugar.readLine();System.out.println(bufferSugar);} catch (IOException e) {// TODO Auto-generated catch block
            e.printStackTrace();}}}

发现没,编程上简单很多。

jad工具反编译,源码分析,try-with-resources做了什么?

简单来说,其实就是帮你做了两件事

  • 添加了close
  • try块里面和close函数都可能抛出异常,这里会将try块抛出的异常压缩成Suppressed Exceptions,可以调用Throwable.getSuppressed方法取出被抑制的异常
package testReadFile;import java.io.*;public class ReadFile
{public ReadFile(){}public static void main(String args[]){String bufferSugar = null;Exception exception;exception = null;Object obj = null;BufferedReader readerSugar = new BufferedReader(new FileReader("src/testRead.txt"));bufferSugar = readerSugar.readLine();System.out.println(bufferSugar);if(readerSugar != null)readerSugar.close();break MISSING_BLOCK_LABEL_90;exception;if(readerSugar != null)readerSugar.close();throw exception;Exception exception1;exception1;if(exception == null)exception = exception1;elseif(exception != exception1)exception.addSuppressed(exception1);throw exception;IOException e;e;e.printStackTrace();}
}

转载于:https://www.cnblogs.com/darrenqiao/p/9201357.html

Java语法糖 : try-with-resources相关推荐

  1. 65.Java语法糖

    65.Java语法糖 语法糖(Syntactic Sugar),也称糖衣语法,是由英国计算机学家 Peter.J.Landin 发明的一个术语,指在计算机语言中添加的某种语法,这种语法对语言的功能并没 ...

  2. Java 语法糖详解

    语法糖(Syntactic Sugar),也称糖衣语法,是由英国计算机学家 Peter.J.Landin 发明的一个术语,指在计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序 ...

  3. Java语法糖1:可变长度参数以及foreach循环原理

    语法糖 接下来几篇文章要开启一个Java语法糖系列,所以首先讲讲什么是语法糖.语法糖是一种几乎每种语言或多或少都提供过的一些方便程序员开发代码的语法,它只是编译器实现的一些小把戏罢了,编译期间以特定的 ...

  4. java语法糖效率高吗_打包 Java将持续向“高糖”方向发展,你真的了解Java语法糖吗? _好机友...

    Java语法糖概念 1. 语法糖Syntactic Sugar 糖衣语法,方便开发人员使用,JVM并不识别,会在编译阶段解语法糖,还原为基础语法. 2. com.sun.tools.javac.mai ...

  5. JAVA语法糖(全)

    JAVA语法糖(全) 目录 概述 字符串拼接 条件编译 断言 枚举与Switch语句 字符串与Switch语句 可变参数 自动装箱/拆箱 枚举 内部类 泛型擦除 增强for循环 lambda表达式 t ...

  6. Jvm 系列(十一)Java 语法糖背后的真相

    语法糖(Syntactic Sugar),也叫糖衣语法,是英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语.指的是,在计算机语言中添加某种语法,这些语法糖虽然不会对语言 ...

  7. Java语法糖之foreach

    语法糖是一种几乎每种语言或多或少都提供过的一些方便程序员开发代码的语法,它只是编译器实现的一些小把戏罢了,编译期间以特定的字节码或者特定的方式对这些语法做一些处理,开发者就可以直接方便地使用了.这些语 ...

  8. Java中switch参数传null会引起异常——Java 语法糖

    问题 switch 参数不能是null,swicth(null)会报java.lang.NullPointerException异常 查找原因 为什么会这样呢,查找一下原因: 找到编译后的class文 ...

  9. c++接口调用外部类_Java基础:Java语法糖4之内部类

    内部类 最后一个语法糖,讲讲内部类,内部类指的就是在一个类的内部再定义一个类. 内部类之所以也是语法糖,是因为它仅仅是一个编译时的概念,outer.java里面定义了一个内部类inner,一旦编译成功 ...

  10. java 语法糖 字符串,java中的一些语法糖

    Java中的语法糖 语法糖的定义:语法糖指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,并没有给语言添加什么新东西,但是更方便程序员使用.通常来说使用语法糖能够增加程序的可读性,从而减少 ...

最新文章

  1. myeclipse 清理项目缓存的几大步骤
  2. iOS酷我音乐导出工具使用说明和原理介绍(提供下载链接及project源代码)
  3. ThinkPad紧凑型蓝牙键盘(0B47189)鼠标滚轮用法,F1到F12功能键的功能切换以及其他技巧
  4. jsp 9对象4作用域
  5. 对比学习视角:重新审视推荐系统的召回粗排模型
  6. 适合初学者的sql_适用于初学者SQL多重连接示例
  7. lua脚本移植到linux平台,如何将lua移植到arm平台的linux内核
  8. Linux开发_反编译开发_破解简单登录程序外加缓冲区溢出攻击
  9. Linux中存放用户密码信息的文件,存放密码过期修改等信息
  10. Java实现图片转化为pdf
  11. HTML meta 标签的使用方式总结(本文总结17中使用方式)
  12. SSL-ZYC NOIP
  13. 【考研英语】作文只是背模板?正确复习姿势了解下
  14. 安装VMware Workstation 16.1
  15. cufflinks suit
  16. 【乐逍遥网站设计】网站建设如何让网站设计更加合理化?
  17. 父母教养方式与幼儿焦虑关系的三水平元分析
  18. 数据结构-二路归并及归并排序
  19. scratch编程神秘的吉普赛读心术
  20. 微信搜一搜迈出新的一步,好戏来了

热门文章

  1. 为什么给他们讲WP的技术秘密
  2. 做软件,运气、天赋、智商、勤奋,你占了几样?
  3. configure: error: You requested G729 audio codec but not found...die
  4. 编译OpenJDK8:[HotspotWrapper.gmk:45:/cygdrive/e/hub/openjdk/jdk8u/build/windows-x86_64-normal-server-
  5. 百度手机输入法,如何使用五笔98版?
  6. python中的time的时间戳_python中的时间time、datetime、str和时间戳
  7. html canvas php,关于HTML canvas的总结
  8. java demo类_《java语言程序设计》初步学习——各种小Demo
  9. java大文件排序_java对大文件进行归并排序(利用胜者树)
  10. Hexo next博客添加折叠块功能添加折叠代码块