110-使用try-catch-finally处理流中的异常-*JDK7和JDK9流中异常的处理 注意变量的作用域是在变量所在的大括号有效

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);//报错因为流已经关了
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值