首页 > 其他分享 >异常处理在IO流中的应用

异常处理在IO流中的应用

时间:2023-02-22 09:56:17浏览次数:63  
标签:... fos 流中 try finally fis IO catch 异常

  • try...catch处理IO流异常的缺陷
  • try..catch...finally
  • try-with-resource

Java异常是Java提供的一种识别及响应错误的一致性机制,java异常机制可以使程序中异常处理代码和正常业务代码分离,保证程序代码更加优雅,并提高程序健壮性。---pdai

try...catch...处理IO异常的缺陷

传统的异常处理一般用try...catch..就可以解决,我们来试一下用它来处理IO


当我们的try语句中的write方法出现异常,我们的异常处理语句将会跳转到catch进行处理,这样的话fos.close资源关闭语句将不会被执行,这样的后果将会很严重

try...catch...finally...

可能是为了避免上面的情况发生,java推出了try...catch...finallly...,这个异常处理语句的核心就是finally里面的语句一定会被执行,像一些需要手动关闭的物理资源就可以放到这个语句里面去执行,我们的IO正好可以使用

  • 关于锁释放的举例

但是finally里面的代码也不能保证一定被执行,在以下情况下不会被执行:

  • 在前面的代码中用了System.exit()退出程序。
  • finally语句块中发生了异常。
  • 程序所在的线程死亡。
  • 关闭CPU。

我们来看上面的finally中出现异常的一种情况:

package com;

import java.io.*;
import java.util.Arrays;

public class ByteStreamDemo3 {
    public static void main(String[]args)  {
        //文件的拷贝(提速版):用try...catch..finally进行异常处理

        FileInputStream fis = null;
        FileOutputStream fos = null;
        //如果当创建fis和fos对象时出现异常,将会进行跳转,fis和fos有没有被初始化的风险
        try {
            //1.定义流的对象
          fis =   new FileInputStream("C:\\Data\\a1.txt");
          fos = new FileOutputStream("small\\sss.txt");

            //2.进行拷贝:边读边写
            //定义字节数组
            int len;//第三方变量
            byte[] bytes = new byte[2];//规定其最多一次读取2个字节
            while ((len = fis.read(bytes))!=-1){
                fos.write(bytes,0,len);//读取多少即写入多少
            }
            //3.关闭资源

        } catch (IOException e) {
           e.printStackTrace();
        } finally {//对于资源的关闭语句也可能会出现异常
            //当fos和fis为空也可能出现空指针异常
            if(fos!= null){
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
           if(fis!=null){
               try {
                   fis.close();
               } catch (IOException e) {
                   e.printStackTrace();
               }
           }

        }

    }
}


在这种情况下,我们的finally语句中的关闭资源的语句也可能会出现异常,假如出现了异常,那么我们的资源就极有可能没有被关闭。

try-with-resource

为了能够安全的关闭资源,在jdk7时候提出了try-with-resource,要求使用try-with-resource的类必须实现AutoCloseable接口

所以实现了AutoCloseable的类的资源可以被自动关闭,不需要手动释放

package com;

import java.io.*;
import java.util.Arrays;

public class ByteStreamDemo3 {
    public static void main(String[]args)  {
        //文件的拷贝(提速版):用try...catch..finally进行异常处理
        //JDK7:io中捕获异常的写法
        /*
        try后面的括号中写创建对象的代码
            注意:只有实现了AutoCloseable接口的类,才能在小括号中创建对象
            try(){

            }catch(){
            }
         */
        try(FileOutputStream fos = new FileOutputStream("small\\sss.txt");
        FileInputStream fis = new FileInputStream("C:\\Data\\a1.txt")){
            //2.进行拷贝:边读边写
            //定义字节数组
            int len;//第三方变量
            byte[] bytes = new byte[2];//规定其最多一次读取2个字节
            while ((len = fis.read(bytes))!=-1){
                fos.write(bytes,0,len);//读取多少即写入多少
            }
        }catch (IOException e){
            e.printStackTrace();
        }

    }
}


使用这个新特性,我们就不需要去手动关闭资源和对关闭资源语句的异常处理了

标签:...,fos,流中,try,finally,fis,IO,catch,异常
From: https://www.cnblogs.com/swtaa/p/17142840.html

相关文章

  • 大规模 IoT 边缘容器集群管理的几种架构-3-Portainer
    前文回顾大规模IoT边缘容器集群管理的几种架构-0-边缘容器及架构简介大规模IoT边缘容器集群管理的几种架构-1-Rancher+K3s大规模IoT边缘容器集群管理的几种架构-......
  • vncviewer 灰屏、黑×,并提示unencryted connection
    环境腾讯云上的Ubuntu18解决方法编辑配置文件,将配置文件修改为如下内容vi~/.vnc/xstartup#!/bin/shexportXKL_XMODMAP_DISABLE=1exportXDG_CURRENT_DESKTOP="......
  • [OS] 这系统只为游戏而生 ReviOS游戏定制版 Win11/Win10
    [OS]这系统只为游戏而生ReviOS游戏定制版Win11/Win10此文章引用地址:https://www.hybase.com/xitong/windows/2679.html哈喽,黑域小伙伴,针对游戏玩家而定制的系统版本......
  • Android studio开发工具下载
    参考:(2条消息)Android基础——2:开发环境搭建及开发工具_ThePromonkeyOf_HeLuo的博客-CSDN博客_thecollectionofandroidplatformapis,toolsand下载前提前安装好jdk......
  • 在PHP和JavaScript中设置Cookie、会话存储(SessionStorage)和本地存储(LocalStorage)
    A.Cookie介绍Cookie:Cookie常用于识别用户,它是服务器留在用户计算机中的小文件(大小限制在4KB),每当相同的计算机通过浏览器请求页面时,它会同时发送Cookie,即Cookie是随HTTP......
  • 最大流应用(Maximum Flow Application)
    1.BipartiteMatching1.1MatchingDef.Givenanundirectedgraph\(G=(V,E)\),subsetofedges\(M⊆E\)isamatchingifeachnodeappearsinatmostone......
  • Android开发环境的搭建-Android Studio
    开始android的学习,首先要搭建开发环境,并下载AndroidStudio。并且测试连接手机jdk的安装之前已经完成了,sdk的安装会在Androidstudio的安装之后自动完成,故不需要担心。找到......
  • fusion app自定义事件源码介绍(上)
    前言文章主要说明在FA中的中文函数的代码实现,不仅要知道用法,更要知其实现的原理。前面的用法为FA中的用法,仅支持在FA中使用,源码可以在其它app中使用。非原创,代码收集整......
  • 集合(Collection)
    前几天做数据结构题碰到了集合,当时并没有学,只是通过做题对此稍微有了了解。今天正好学到了,来做一下学习记录。 一.集合总体框架由上图可知,集合的实现方式有两大类:(1)......
  • IO流
    File与IO流Author:MsuenbDate:2023-02-21File类java.io.File类:文件和文件目录路径的抽象表示形式,与平台无关File能新建、删除、重命名文件和目录,但不能访问文......