首先看一段代码:
这段代码有明显的IO异常。一般我们的做法是捕获异常。
public static void main(String[] args) {
try {
// 文件可能不存在
FileWriter ; fw= new FileWriter("W:\\demo.txt");
// 写到一半可能失败
fw.write("fhuerfjebfj"+LINE_SEPARATOR+"hubjhj");
//底层关闭资源时可能向上抛出异常
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
但是如果在文件创建过程中失败,可能程序就挂了。那么还是需要关闭io流。所以就得出下一个finally
但是这样fw对象的作用域是在finally是无效的。所以就得把fw拿到try{ xxx}外层定义。
close底层可能出现错误。所以又得捕获异常。
直至这样子我们的代码才能通过编译期。
public static void main(String[] args) {
/**
* 流对象的处理方式是在try的外面创建引用变量
* 在try{} 里面进行对象的初始化
*/
FileWriter fw =null;
try {
// 文件可能不存在
fw = new FileWriter("W:\\demo.txt");
// 写到一半可能失败
fw.write("fhuerfjebfj"+LINE_SEPARATOR+"hubjhj");
//底层关闭资源时可能向上抛出异常
fw.close();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
运行却抛出空指针异常:这是因为在创建文件目录时出现了异常,fw为空,还要运行fw.close( )所导致。
直至修改如此我们的代码才处理好了IOException异常和空指针异常
public static void main(String[] args) {
/**
* 流对象的处理方式是在try的外面创建引用变量
* 在try{} 里面进行对象的初始化
*/
FileWriter fw =null;
try {
// 文件可能不存在
fw = new FileWriter("W:\\demo.txt");
// 写到一半可能失败
fw.write("fhuerfjebfj"+LINE_SEPARATOR+"hubjhj");
//底层关闭资源时可能向上抛出异常
fw.close();
} catch (IOException e) {
e.printStackTrace();
}finally {
if (fw != null) {
try {
fw.close();
} catch (IOException e) {
throw new RuntimeException("关闭失败.....");
}
}
}
}