Java语法糖 : try-with-resources
先了解几个背景知识
- 什么是语法糖
- 语法糖是在语言中增加的某种语法,在不影响功能的情况下为程序员提供更方便的使用方式。
- 什么是资源
- 使用之后需要释放或者回收的都可以称为资源,比如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();
}
}
Java语法糖 : try-with-resources的更多相关文章
- Java语法糖1:可变长度参数以及foreach循环原理
语法糖 接下来几篇文章要开启一个Java语法糖系列,所以首先讲讲什么是语法糖.语法糖是一种几乎每种语言或多或少都提供过的一些方便程序员开发代码的语法,它只是编译器实现的一些小把戏罢了,编译期间以特定的 ...
- Java语法糖设计
语法糖 Java语法糖系列,所以首先讲讲什么是语法糖.语法糖是一种几乎每种语言或多或少都提供过的一些方便程序员开发代码的语法,它只是编译器实现的一些小把戏罢了,编译期间以特定的字节码或者特定的方式对这 ...
- java语法糖---枚举
java语法糖---枚举 在JDK5.0中提供了大量的语法糖,例如:自动装箱拆箱.增强for循环.枚举.泛型等.所谓“语法糖”就是指提供更便利的语法供程序员使用,只是在编译器上做了手脚,却没有提供 ...
- Java语法糖(二)
语法糖之四:内部类 内部类:顾名思义,在类的内部在定义一个类.内部类仅仅是编译时的概念,编译成字节码后,内部类会生成单独的Class文件. 四种:成员内部类.局部内部类.匿名内部类.静态内部类. 1. ...
- Java语法糖(一)
概述 语法糖(Syntactic Sugar):主要作用是提高编码效率,减少编码出错的机会. 解语法糖发生在Java源码被编译成Class字节码的过程中,还原回简单的基础语法结构. 语法糖之一:泛型( ...
- Java语法糖4:内部类
内部类 最后一个语法糖,讲讲内部类,内部类指的就是在一个类的内部再定义一个类. 内部类之所以也是语法糖,是因为它仅仅是一个编译时的概念,outer.java里面定义了一个内部类inner,一旦编译成功 ...
- 转:【深入Java虚拟机】之六:Java语法糖
转载请注明出处:http://blog.csdn.net/ns_code/article/details/18011009 语法糖(Syntactic Sugar),也称糖衣语法,是由英国计算机学家P ...
- 早期(编译器)优化--Java语法糖的味道
1.泛型与类型擦除 泛型的本质是参数化类型的应用,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和方法的创建中,分别称为泛型类.泛型接口和泛型方法.在泛型没有出现之前,只能通过 ...
- Java 语法糖详解
语法糖 语法糖(Syntactic Sugar),也称糖衣语法,是由英国计算机学家 Peter.J.Landin 发明的一个术语,指在计算机语言中添加的某种语法. 这种语法对语言的功能并没有影响,但是 ...
- JVM总结-Java语法糖与Java编译器
自动装箱与自动拆箱 首先要提到的便是 Java 的自动装箱(auto-boxing)和自动拆箱(auto-unboxing). 我们知道,Java 语言拥有 8 个基本类型,每个基本类型都有对应的包装 ...
随机推荐
- Last_SQL_Error: Error 'Can't drop database 'ABC'; database doesn't exist' on query. Default database: 'ABC'. Query: 'drop database ABC'
查看从库状态发现报错: show slave status\G; 发现是主库上删除了一个数据库,但是从库上面没有,从库执行这个语句的时候失败报错. 解决方法: 停止从库 stop slave; 创建语 ...
- C与C++混编
了解一下C与C++如何合作,gcc和g++编译出来的东西有什么区别. 工具使用 objdump是个好工具,可以用于查看.o文件的内容,也可以查看可执行文件的内容. 查看符号表 objdump -t f ...
- 手工执行sql tuning advisor和sql access advisor
sql tuning advisor:创建任务DECLARE my_task_name VARCHAR2(30); my_sqltext CLOB; BEGIN my_sqltext := 'SELE ...
- electricity meter就是电表
英式英语metre意思是度量衡里面的单位:米 美式英语拼为 meter 除了“米”,还有一个意思是“计量器”,比如 parking meter就是是路边停车投币计时器,cab meter就是出租车的计 ...
- PhoneGap 的存储 API_localStorage 和 sessionStorage
一.介绍 1.为了替代Cookile这门古老的客户端存储技术,Html5的WEB Storage Api 提供了俩中在 客户端存储数据库的方法:localStorage 和 sessionStorag ...
- O(1) 和 O(n) 的区别
举个简单的例子,要从0加到n,我们会这么写:int sum = 0;for(int i = 0; i<=n; ++i){ sum += i;}一共算了n次加法,那么就说这个时间复杂度是O(n ...
- diogo谈框,仿prompt()方法布局
展示效果: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...
- Kindeditor图片上传Controller
asp.net MVC Kindeditor 图片.文件上传所用的Controller [HttpPost, AllowAnonymous] public ActionResult UploadIma ...
- 能成为一名合格的Java架构师
原文地址:http://www.dalbll.com/Group/Topic/ArchitecturedDesign/4943 俗话说“没有见过好程序,怎么可能写出好程序”,同样,也可以说“不了解架构 ...
- Java反射机制--是什么,为什么,怎么用。
往往当我们面对一项新的知识时,我们往往需要知道三个方面,它是什么,它能做什么,它比原有知识强在哪里,我们该怎么使用它.当你能够解决这些问题时,便意味着你已经对这项知识入门了. 一.是什么 Java R ...