在jdk1.7之前使用try…catch finally处理流中的异常
示范jdk1.7之前如何处理流中的异常
public static void main(String[] args) {
FileWriter fw = null;
try {
fw = new FileWriter("e:\\a.txt");
fw.write("测试");
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
fw.close();
} catch (IOException e) {
e.printStackTrace();
}catch (NullPointerException e){
System.out.println(e);
}
}
System.out.println("不影响我的输出");
}
得到的结果为:
注意:
① 声明fw写在最外面是因为如果写在try中,那么finally中的fw调用步到fw,作用域范围不够
② 声明fw并且让他等于null是因为,如过不赋值的话,那么如果try中的代码出现了异常,那么fw就处于没有被赋值的状态,然后再finally中调用的话,会出现异常,因为这时候fw没有被赋值
③ 再finally中还处理了空指针异常是因为,如果try中报错了的话,我赋的值是null,所以再finally中fw等于null,那么在调用fw的话会出现空指针异常,所以需要处理
在jdk7的时候出现了一个新特性,用来处理流的异常
在jdk1.7当中,tr后面可以增加一个括号,在括号中我们可以用来定义流对象,那么这个流对象的作用域在try中有效,在try中的代码执行完毕后,就会自动把流对象释放,不用我们把流对象定义在try的外面,不用考虑定义域的问题,并且在try中的代码执行完毕后,自动把流对象释放,不需要我们写finally来close释放流对象,使用起来很方便
示范如下
ublic static void main(String[] args) {
try(
FileWriter fw = new FileWriter("d:\\e.txt");
){
fw.write("你好啊");
}catch (IOException e){
System.out.println(e);
}
System.out.println("不影响我的打印输出");
}
得到的结果为:
注意:
① 我们在使用这种方式的优点就是它可以自动释放我们定义在括号当中的流对象,不需要我们手动在finally代码块中释放流对象有关资源
② 同时我们不需要考虑变量的作用范围导致的一些问题
jdk9中也有一个新特性用来处理流中的异常
在jdk9中可以在try的前面可以定义对象,在try后面的括号当中可以直接引用对象名称(变量名),在try代码执行完毕后,流对象也可以释放掉,不用我们自己去释放