Java语法糖 : try-with-resources
2024-09-22 15:53:22
先了解几个背景知识
- 什么是语法糖
- 语法糖是在语言中增加的某种语法,在不影响功能的情况下为程序员提供更方便的使用方式。
- 什么是资源
- 使用之后需要释放或者回收的都可以称为资源,比如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();
}
}
最新文章
- 仿h5拖拽
- 基于spring4.0配置分布式ehcache,以及相关使用
- 【英语】Bingo口语笔记(32) - 口语中的弱读
- javamail模拟邮箱功能发送电子邮件-中级实战篇【新增附件发送方法】(javamail API电子邮件实例)
- [转载]mvc使用JsonResult返回Json数据
- bzoj3196
- location.hash 详解
- 第二章 Stream API
- Android多媒体开发-- android中OpenMax的实现整体框架
- vsftpd限制用户不能更改根目录
- java学习之IO文件分割
- CSDN编程挑战——《高斯公式》
- Swift\本地文件管理
- fgets()函数以及fputs()函数
- THINKPHP 3.2 PHP SFTP上传下载 代码实现方法
- memcache 中的add set 和replace的区别
- 移动端解决单机事件延迟fastclick
- Linux对大容量磁盘分区
- 翻译:SET PASSWORD语句(已提交到MariaDB官方手册)
- plsql 工具怎样导出 oracle 表结构
热门文章
- nodepad++通过正则表达式,删除带有特殊字符的某一行
- QT的lineidet的光标问题
- js创建对象的几种方式 标签: javascript 2016-08-21 15:23 123人阅读 评论(0)
- python 枚举类
- 学习WebSocket一(WebSocket初识)
- Task ‘run’ not found in root project
- 关于Hibernate懒加载问题的最终解决方案
- 我上线的android版app
- 用python实现矩阵转置
- 走进__proto__属性,看ie是否支持它,谁又来给他归宿