JDK7前的IO流异常处理
无法使用throws声明抛出异常交给方法调用者直到给到JVM去处理,只能try-catch-finally代码块捕捉异常,处理异常。
public static void main(String[] args) {
//提高变量fw的作用域,让finally可以使用
//变量在定义的时候,可以没有值,但是使用的时候必须有值
//fw = new FileWriter("E:\\g.txt",true); 执行失败,fw没有值,fw.close会报错
FileWriter fw = null;
try{
//可能会产出异常的代码
fw = new FileWriter("w:\\aaa\\g.txt",true);
for (int i = 0; i <10 ; i++) {
fw.write("HelloWorld"+i+"\r\n");
}
}catch(IOException e){
//异常的处理逻辑
System.out.println(e);
}finally {
//一定会指定的代码
//创建对象失败了,fw的默认值就是null,null是不能调用方法的,会抛出NullPointerException,需要增加一个判断,不是null在把资源释放
if(fw!=null){
try {
//fw.close方法声明抛出了IOException异常对象,所以我们就的处理这个异常对象,要么throws,要么try catch
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}}
}
这样写就很麻烦。
而JDK7之后新特性,在try的后边可以增加一个(),在括号中可以定义流对象,那么这个流对象的作用域就在try中有效,try中的代码执行完毕,会自动把流对象释放,不用写finally。
try (FileWriter fw = new FileWriter("D:\\a\\bc.txt", true)) { } catch (IOException e) { e.printStackTrace(); }
而JDK9又有新特性:在try的前边可以定义流对象,在try后边可以引入流对象的名称(变量名),在try代码执行完毕之后,流对象也可以释放掉,不用写finally。但是这个异常需要throws声明。
格式:
A a = new A();
B b = new B();
try(a,b){}
catch(){}
private static void show03() throws IOException { FileWriter fw = new FileWriter("D:\\a\\bc.txt", true); try(fw){ fw.write(new char[]{'1','2'}); } catch (IOException e) { e.printStackTrace(); } }