先了解几个背景知识

  • 什么是语法糖

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

    • 使用之后需要释放或者回收的都可以称为资源,比如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;
else
if(exception != exception1)
exception.addSuppressed(exception1);
throw exception;
IOException e;
e;
e.printStackTrace();
}
}

最新文章

  1. 仿h5拖拽
  2. 基于spring4.0配置分布式ehcache,以及相关使用
  3. 【英语】Bingo口语笔记(32) - 口语中的弱读
  4. javamail模拟邮箱功能发送电子邮件-中级实战篇【新增附件发送方法】(javamail API电子邮件实例)
  5. [转载]mvc使用JsonResult返回Json数据
  6. bzoj3196
  7. location.hash 详解
  8. 第二章 Stream API
  9. Android多媒体开发-- android中OpenMax的实现整体框架
  10. vsftpd限制用户不能更改根目录
  11. java学习之IO文件分割
  12. CSDN编程挑战——《高斯公式》
  13. Swift\本地文件管理
  14. fgets()函数以及fputs()函数
  15. THINKPHP 3.2 PHP SFTP上传下载 代码实现方法
  16. memcache 中的add set 和replace的区别
  17. 移动端解决单机事件延迟fastclick
  18. Linux对大容量磁盘分区
  19. 翻译:SET PASSWORD语句(已提交到MariaDB官方手册)
  20. plsql 工具怎样导出 oracle 表结构

热门文章

  1. nodepad++通过正则表达式,删除带有特殊字符的某一行
  2. QT的lineidet的光标问题
  3. js创建对象的几种方式 标签: javascript 2016-08-21 15:23 123人阅读 评论(0)
  4. python 枚举类
  5. 学习WebSocket一(WebSocket初识)
  6. Task ‘run’ not found in root project
  7. 关于Hibernate懒加载问题的最终解决方案
  8. 我上线的android版app
  9. 用python实现矩阵转置
  10. 走进__proto__属性,看ie是否支持它,谁又来给他归宿