如何通过try-catch自动实现IO流的关闭
在jdk1.7版本中通过在try后增加一个()在()中创建IO流的对象,默认就会
在我们学习的常用的异常处理中,语法为
try{
}catch(Exception e){
}
而该方法无法实现IO流的错误分离。我们来参考下述代码。
try{
FileReader fr = new FileReader("lmz.txt");
int s = fr.read();
System.out.println(s);
fr.close();
}catch (Exception e){
e.printStackTrace();
}
上述代码我们发现我们将创建的IO流的对象和关闭流的方法放到了一个捕获异常的语句中,当该代码块内容出错时我们无法确认时创建对象的错误,还是关闭流的方法的错误。
想要分离异常,需要变得非常复杂,代码如下:
FileReader fr = null;
try{
fr = new FileReader("lmz.txt");
int s = fr.read();
System.out.println(s);
}catch (IOException e){
e.printStackTrace();
}finally {
try {
fr.close();
}catch (Exception e){
e.printStackTrace();
}
}
为防止代码过于复杂,在jdk1.7中,Java新增了异常语句,在try语句后加()括号内添加一条实现了AutoCloseable接口的方法。
try(FileReader fr = new FileReader("lmz.txt")){
int s = fr.read();
System.out.println(s);
}catch (IOException e){
e.printStackTrace();
}
其功能为默认在finally语句中执行close方法。
其中FileReader fr = new FileReader(“lmz.txt”);语句默认实现了AutoCloseable接口。
AutoCloseable接口的功能就是必须包含close方法,满足包含close的方法后,在try-catch-finally语句中的finally语句中默认自动执行close方法。
在jdk1.9中实现了,在()内传入实现AutoCloseable的对象名称即可自动在finally语句中执行close方法,参考代码如下:
public class Demo {
public static void main(String[] args) throws IOException {
CloseDome cd = new CloseDome();
CloseDome2 cd2 = new CloseDome2();
try(cd;cd2){
}catch (Exception e){
}
}
static class CloseDome implements Closeable{
@Override
public void close() throws IOException {
System.out.println("close方法被调用1");
}
}
static class CloseDome2 implements Closeable{
public void close() throws IOException{
System.out.println("close方法被调用2");
}
}
}
该代码会打印出:
close方法被调用1
close方法被调用2