当前位置: 首页 > news >正文

IO异常的处理

JDK7前的IO流异常处理

无法使用throws声明抛出异常交给方法调用者直到给到JVM去处理,只能try-catch-finally代码块捕捉异常,处理异常。

public static void main(String[] args) {
        //提高变量fw的作用域,让finally可以使用
        //变量在定义的时候,可以没有值,但是使用的时候必须有值
        //fw = new FileWriter("E:\\g.txt",true); 执行失败,fw没有值,fw.close会报错
        FileWriter fw = null;
        try{
            //可能会产出异常的代码
            fw = new FileWriter("w:\\aaa\\g.txt",true);
            for (int i = 0; i <10 ; i++) {
                fw.write("HelloWorld"+i+"\r\n");
            }
        }catch(IOException e){
            //异常的处理逻辑
            System.out.println(e);
        }finally {
            //一定会指定的代码
            //创建对象失败了,fw的默认值就是null,null是不能调用方法的,会抛出NullPointerException,需要增加一个判断,不是null在把资源释放
            if(fw!=null){
                try {
                    //fw.close方法声明抛出了IOException异常对象,所以我们就的处理这个异常对象,要么throws,要么try catch
                    fw.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

        }
    }

这样写就很麻烦。

而JDK7之后新特性,在try的后边可以增加一个(),在括号中可以定义流对象,那么这个流对象的作用域就在try中有效,try中的代码执行完毕,会自动把流对象释放,不用写finally。

try (FileWriter fw = new FileWriter("D:\\a\\bc.txt", true)) {
} catch (IOException e) {
    e.printStackTrace();
}

而JDK9又有新特性:在try的前边可以定义流对象,在try后边可以引入流对象的名称(变量名),在try代码执行完毕之后,流对象也可以释放掉,不用写finally。但是这个异常需要throws声明。

格式:

A a = new A();

B b = new B();

try(a,b){}

catch(){}

private static void show03() throws IOException {
    FileWriter fw = new FileWriter("D:\\a\\bc.txt", true);
    try(fw){
        fw.write(new char[]{'1','2'});
    } catch (IOException e) {
        e.printStackTrace();
    }
}

 

相关文章:

  • 栈Stack(数组模拟、单链表模拟)
  • 属性集合Properties
  • 缓冲流
  • 转换流InputStreamReader类和OutputStreamWriter(字符编码和字符集)
  • 序列化与反序列化和transient瞬态关键字
  • 打印流
  • 前缀(波兰)、中缀、后缀(逆波兰)表达式
  • 递归(回溯之迷宫问题+八皇后)
  • 算法题-Java实现:从 1 到 n 整数中 1 出现的次数(时间复杂度O(logn))
  • 软件结构/网络通信协议/IP地址/端口号
  • TCP通信程序
  • C/S结构文件上传案例
  • 排序算法(冒泡排序、选择排序、插入排序、希尔排序、快速排序、归并排序、基数排序)
  • 二分查找和插值查找
  • 树-二叉树(前中后序遍历+按值查找+删除节点)
  • JavaScript 如何正确处理 Unicode 编码问题!
  • 【391天】每日项目总结系列128(2018.03.03)
  • 2017-08-04 前端日报
  • CODING 缺陷管理功能正式开始公测
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • linux安装openssl、swoole等扩展的具体步骤
  • Mac转Windows的拯救指南
  • Mithril.js 入门介绍
  • PAT A1120
  • Python学习之路16-使用API
  • session共享问题解决方案
  • VuePress 静态网站生成
  • 高性能JavaScript阅读简记(三)
  • 离散点最小(凸)包围边界查找
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 写给高年级小学生看的《Bash 指南》
  • 用element的upload组件实现多图片上传和压缩
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • # Maven错误Error executing Maven
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • #pragma data_seg 共享数据区(转)
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • ${factoryList }后面有空格不影响
  • (C语言)共用体union的用法举例
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (一)Java算法:二分查找
  • (转)树状数组
  • .NET Framework 和 .NET Core 在默认情况下垃圾回收(GC)机制的不同(局部变量部分)
  • .net 后台导出excel ,word
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地定义和使用弱事件
  • .NET轻量级ORM组件Dapper葵花宝典
  • .Net中ListT 泛型转成DataTable、DataSet
  • [ Algorithm ] N次方算法 N Square 动态规划解决
  • [ 第一章] JavaScript 简史