参考博客
语法糖
在语言中增加的某种语法,在不影响功能的情况下为程序员提供更方便的使用方式。
资源
使用之后需要释放或者回收的都可以称为资源,比如JDBC的connection连接,文件IO的各种类。
try-with-resources
java的一个语法糖,在try语句中声明一个或者多个资源。
使用对象
实现了 java.lang.AutoCloseable/java.io.Closeable 的类对象
使用示例
try-catch-final
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();
}
}
}
内部实现
- 添加了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();
}
}