1.为什么要写处理异常?
我们之前只要是只用到IO流的时候为了方便,一般都直接把异常给throw出去了。但是这样做存在不妥当的地方,因为我们根本就没有处理异常 只是抛了出去。更加重要的就是有可能在我们释放资源之前程序就因为异常退出了,导致并没有释放资源
2.处理异常的几种方法
注意后面两个都是自动释放资源
3.代码演示三种方法
方法一 直接抛出异常等于没有处理 try…catch…finally
//这种方法抛出了异常 谁调用我社还要在再抛出异常
//我抛出了异常 谁调用我社还要在再抛出异常
public static void method1() throws IOException {
//实现使用字符流的便捷方法赋值一个字符文件
FileReader fr = new FileReader("C:\\Users\\Administrator\\IdeaProjects\\Day07\\b.txt");
FileWriter fw = new FileWriter("C:\\Users\\Administrator\\IdeaProjects\\Day07\\bbbb.txt");
//一个字符数组一个字符书数组的读
int len ;
char chars[] = new char[1024];
while ((len = fr.read(chars)) != -1){
//复制文件
fw.write(chars,0,len);
}
//释放资源
fw.close();
}
方法二 try…catch…finally
//这种方法使用try catch 进行处理了 谁调用我就不用再抛出异常了
//但是这样处理也太繁琐了 到处都是try catch
//我使用try catch 进行处理了 谁调用我就不用再抛出异常了
//但是这样处理也太繁琐了 到处都是try catch
public static void method2() {
FileReader fr = null;
FileWriter fw = null;
try {
//实现使用字符流的便捷方法赋值一个字符文件
fr = new FileReader("C:\\Users\\Administrator\\IdeaProjects\\Day07\\b.txt");
fw = new FileWriter("C:\\Users\\Administrator\\IdeaProjects\\Day07\\bbbb.txt");
//一个字符数组一个字符书数组的读
int len ;
char chars[] = new char[1024];
while ((len = fr.read(chars)) != -1){
//复制文件
fw.write(chars,0,len);
}
}catch (Exception e){
}finally {
//判断对象是否为空 不为空的时候才释资源
if (fr != null){
try {
//释放资源
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fw != null){
//释放资源
try {
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
方法三 JDK 7 后提供的解决方法
//di第二种方法虽然对异常做了处理 但是太过于复杂
//JDK 7 以后又给出了一个解决方案
格式
try( 创建IO流对象 ){
可能出现细长的代码
}catch(异常类型 变量名){
异常的处理代码
}
这种法方式是自动释放资源
//di第二种方法虽然对异常做了处理 但是太过于复杂
//JDK 7 以后又给出了一个解决方案
/*
格式
try( 创建IO流对象 ){
可能出现细长的代码
}catch(异常类型 变量名){
异常的处理代码
}
这种法方式是自动释放资源
*/
public static void method3(){
try ( FileReader fr = new FileReader("C:\\Users\\Administrator\\IdeaProjects\\Day07\\b.txt");
FileWriter fw = new FileWriter("C:\\Users\\Administrator\\IdeaProjects\\Day07\\bbbb.txt");
){
//一次读取一个字符数组
int len ;
char chars[] = new char[1024];
while ((len = fr.read(chars)) != -1 ){
fw.write(chars,0,len);
}
}catch (IOException exception){
exception.printStackTrace();
}
}
方法四 JDK 9 后提供的解决方法
//第三种方法就已经很好了 但是JDK9以后有给出了别的解决方案
格式
定义输入流对象 ;
定义输出流对象 ;
try( 输入流对象名 ; 输出流对象名 ){
可能出现异常的代码
}catch(异常类型 异常对象){
异常的处理代码
}
//注意这种方式也是自动释放对象
//但是这种方法 还是要抛出异常 不太好 还是建议JDK7的解决方案
public static void method4() throws IOException {
FileReader fr = new FileReader("C:\\Users\\Administrator\\IdeaProjects\\Day07\\b.txt");
FileWriter fw = new FileWriter("C:\\Users\\Administrator\\IdeaProjects\\Day07\\bbbb.txt");
try (fr ; fw){
//一次读取一个字符数组
int len ;
char chars[] = new char[1024];
while ((len = fr.read(chars)) != -1 ){
fw.write(chars,0,len);
}
}catch (Exception e){
e.printStackTrace();
}
}