1.使用try-catch-finally处理流中的异常 在jdk1.7之前 try catch finally处理流中的异常 格式:try{ 可能会产生异常的代码 }catch(异常类的变量 变量名){ 异常的处理逻辑 }finally{ 一定会执行的代码 资源的释放
package demo05;
import java.io.FileWriter;
import java.io.IOException;
/*
在jdk1.7之前 try catch finally处理流中的异常
格式:try{
可能会产生异常的代码
}catch(异常类的变量 变量名){
异常的处理逻辑
}finally{
一定会执行的代码
资源的释放
}
*/
public class Demo05TryCatch {
public static void main(String[] args) {
FileWriter fw = null; 注意变量的作用域是在变量所在的大括号有效 这里是个局部变量
//提高变量fw的作用域,让finally可以使用
//变量定义时可以没有值但是使用时一定要有值 所以要赋值一个null 任何变量都可以赋值full
// FileWriter fw = new FileWriter("D:\\IdeaProjects\\新建文件夹\\k.txt", true);若执行失败 fw就没有值 fw.close();就执行失败
try {
fw = new FileWriter("D:\\IdeaProjects\\新建文件夹\\k.txt", true);
for (int i = 0; i < 10; i++) {
fw.write("HelloWorld" + i + "\r\n");
}
//fw.close();//如果关闭前面的代码出现了问题就不会资源释放所以放在finally中
} catch (IOException e) {
System.out.println(e); //处理逻辑:打印异常
} finally {//一定会执行的代码
//如果创建对象失败了(好比找不到文件路径),fw的默认值是null,而null是不能调用方法的会抛出空指针异常NollPointerException
//需要增加一个判断,不是null再释放资源
if (fw != null) {
try {
fw.close(); // 直接fw.close();报错 因为超出了变量的作用域 close有异常所以try catch一次
} catch (IOException e) {
e.printStackTrace();
}//fw.close();方法声明抛出了IOException异常对象,所以要处理这个异常要么throws,要么try...catch
}
}
}
}
以上注意几点:
1.FileWriter fw = null 定义在外面是因为变量的作用域问题;
2.因为如果创建对象失败了(好比找不到文件路径)这个时候fw不会被赋值,fw的默认值是null,而null是不能调用方法的会抛出空指针异常NollPointerException,finally中加了一个判断fw!=null是为了创建对象失败时抛出空指针异常。
2.JDK7和JDK9流中异常的处理
JDK7的新特性 在try的后边可以增加一个(),括号中可以定义流对象 呢么这个流对象的作用域就在try中有效 try中的代码执行完毕,会自动把流对象释放,不用写finally 格式:try(定义流对象;定义流对象){ 可能会产生异常的代码 }catch(异常类的变量 变量名){ 异常的处理逻辑 }
package demo05;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
/*
JDK7的新特性
在try的后边可以增加一个(),括号中可以定义流对象
呢么这个流对象的作用域就在try中有效
try中的代码执行完毕,会自动把流对象释放,不用写finally
格式:try(定义流对象;定于流对象){
可能会产生异常的代码
}catch(异常类的变量 变量名){
异常的处理逻辑
}
*/
public class Demo05JDK7 {
public static void main(String[] args) {
try( FileInputStream fis = new FileInputStream("C:\\03_字节流读取文件的原理.bmp");
FileOutputStream fos = new FileOutputStream("d:\\01.bmp");) {
byte[] bytes = new byte[1024];
int len =0;
while((len=fis.read(bytes))!=-1){
fos.write(bytes,0,len);
fos.close();
}
}catch(IOException e){
System.out.println(e);}
}
}
JDK9的新特性 在try的前面可以定义流对象 在try后面的()中可以直接引入流对象的名称(变量名) 在try代码块执行完毕之后,流对象也可以释放掉,不用写finally 格式: A a = new A(); B b = new B(); try(a;b是对象名){ 可能会产生异常的代码 }catch(异常类的变量 变量名){ 异常的处理逻辑 }
package demo05;
import javafx.scene.chart.ScatterChart;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
/*
JDK9的新特性
在try的前面可以定义流对象
在try后面的()中可以直接引入流对象的名称(变量名)
在try代码块执行完毕之后,流对象也可以释放掉,不用写finally
格式:
A a = new A();
B b = new B();
try(a;b是对象名){
可能会产生异常的代码
}catch(异常类的变量 变量名){
异常的处理逻辑
}
*/
public class Demo06JDK9 {
public static void main(String[] args) throws FileNotFoundException {
FileInputStream fis = new FileInputStream("C:\\03_字节流读取文件的原理.bmp");
FileOutputStream fos = new FileOutputStream("d:\\02.bmp");
try(fis;fos){
int len = 0;
while((len=fis.read())!=-1) {
fos.write(len);
fos.close();
}
}catch(IOException e){
System.out.println(e);
}
// fos.write(97);//报错因为流已经关了
}
}