IO流(异常的处理)

2023-10-30

IO流

概述

IO流,又叫输入输出流,当我们将内存中的数据写到硬盘上时,这个过程叫输出流(Output),当我们将硬盘上的数据读取到内存中时,叫做输入流(Input)。流本身是一个抽象概念,是 对数据传输的总称,也就是说,数据在设备键的传输,叫做流

重点:

明确操作是读还是写

使用何种类型的流

铺垫技术:

学习IO流之前,我们需要学习两个铺垫技术:一个是异常,一个是File类

**异常:**因为在介质传输数据会有很多问题,比如:找不到文件,文件格式错误,读写错误,我们需要知道当进入到这些问题时,如何去处理

**File:**流的操作会涉及很多的文件操作,所以我们也要学习与文件相关的类—File类

异常:

**概述:**程序出现 不正常的情况

分类:

程序异常:Throwable Throwable 类是 Java 语言中所有错误或异常的父类

严重问题----Error:我们不去处理,因为处理不了,比如:内存溢出问题

一般问题----Exception:

​ 编译时异常:除了RuntimeException的异常都是编译时异常,这种异常必须在程序执行前进行处理。

​ 运行时异常:RuntimeException,这个问题我们也不做处理。因为造成的原因多数是我们的逻辑不够严谨,需要我们去修改代码
案例:

public class ExceptionDemo {
    public static void main(String[] args) {
        //第一模块
        int a = 10;
        int b = 0;
        System.out.println(a / b);

        System.out.println("我是第二模块");
    }
}

分析:

程序出现问题后,控制台打印错误信息:包括Exception包名+类名,错误的描述,错误出现的位置。这些对于异常的操作我们并没有做,而是JVM替我们做的。

所以,当我们不做任何异常处理时,我们的JVM会对异常执行一个默认的操作

异常处理:
方式:

try…catch…finally

throws

try…catch…finally

格式:

try{
    //可能出现问题的代码
}catch(异常类名 变量名){
    
    //针对异常的处理
    
    
    
}finally{
    
    //释放资源
    //它不是必须
    
}

**注意:

1.try里面包裹的代码越少越好,因为被try包裹的代码在执行时需要走异常处理机制,需要JVM给该机制分配额外的资源去管理代码,所以包裹越少,越节省资源

2.catch中必须有对异常的处理,哪怕时一句输出语句也可以,因为不做任何处理的话,相当于把异常隐藏了,而不是处理了

3.try结构中的语句,一但捕获到异常,剩下的代码不再执行,直接执行catch的代码

示例:

/**
 * 多个异常的处理
 */
public class ExceptionDemo2 {
    public static void main(String[] args) {
        method();
        System.out.println("程序执行完毕");
    }

    private static void method() {
        int a = 10;
        int b = 0;
        try {
           //System.out.println(a / b);
            int[] c = {1, 2, 3};
            System.out.println(c[4]);
        } catch (ArithmeticException arithmeticException) {
            System.out.println("除数不能为0");
           // arithmeticException.printStackTrace();
        } catch (ArrayIndexOutOfBoundsException arrayIndexOutOfBoundsException) {
            System.out.println("数组越界了" );
        }


    }
}
/**
 * 多个异常的处理
 */
public class ExceptionA {
    public static void main(String[] args) {
        method();
        System.out.println("程序执行完毕");

    }
     //多个try...catch
    public static void method() {
        int a = 10;
        int b = 0;
        try {
            System.out.println(a / b);

        } catch (ArithmeticException arithmeticException) {
            System.out.println("除数不能为0!");

        }

        try {
            int[] c = {1, 2, 3};
            System.out.println(c[4]);

        } catch (ArrayIndexOutOfBoundsException arrayIndexOutOfBoundsException) {
            System.out.println("出错了");
        }
    }
}

处理方式:

1.一个try,多个catch

​ a.如果异常类在继承体系结构中处于平级关系,他们呢的前后不影响执行结果

​ b.如果异常在继承体系结构中处于父子关系,则父类异常必须写在后面,否则子类异常不会被正常匹配到

2.多个try…catch

3.一个try…catch,catch中的类可以写Exception类,它可以用来匹配所有子类异常

JDK7新特性–异常处理

格式:

try{
    //可能出现异常的代码
}catch(异常1 |异常2|...变量名){
    //异常处理
}
public class ExceptionDemo3 {
    public static void main(String[] args) {
         method();
        System.out.println("程序结束");
    }

    private static void method() {
        int a = 10;
        int b = 0;
        int[] c = {1, 2, 3};
        try {
            System.out.println(a / b);
            System.out.println(c[4]);

        } catch (ArithmeticException | ArrayIndexOutOfBoundsException e) {
            System.out.println("出错了");
        }

    }
}

注意:

1.多个异常必须是平级关系

2.针对不同异常,处理方式一致

编译时异常和运行时异常

**编译时异常:**我们在执行程序,必须处理掉的异常,如果不处理,程序将不能编译正常

**运行时异常:**不需要我们显示处理,但是我们也可以使用try…catch处理

案例:

/**
 * 编译时异常:必须通过异常处理,代码才能通过编译
 */
public class ExceptionDemo4 {
    public static void main(String[] args) {
        String day = "2020-11-29";
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM--dd");
        try {
            Date date = sdf.parse(day);
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
}
Throwable

常用方法:

/**
 * Throwable:
 * public String getMessage():返回此 throwable 的详细消息字符串。
 * public String toString():返回此 throwable 的简短描述。
 *     组成:
 *        此异常类的全路径类名
 *        ":"
 *         调用此对象 getLocalizedMessage() 方法的结果 
 *           如果 getLocalizedMessage 返回 null,则只返回类名称。 
 * public void printStackTrace():获取异常类名和异常信息描述以及错误出现的位置
 * public void printStackTrace(PrintStream s):将此 throwable 及其追踪输出到指定的输出流。
 */
throws

在开发中,如果去调用别人写的代码,我们很难判断调用方法时是否会发生异常。针对这种情况,java允许在方法后面使用throws关键字对外声明该方法在使用过程中可能发生的异常,这样调用者在调用方法时,就明确知道该方法有异常,并必须处理掉异常,否则代码将无法通过编译。

格式

方法()throws 异常类名1,异常类名2,...

注意:

我们在调用方法时,如果不做异常处理,我们可以选择抛出(throws),直到main方法抛给JVM为止,这种情况,JVM就会采取默认处理方式处理异常,尽量不要在主方法抛出。

案例:

/**
 * throws 演示案例
 */
public class ThrowsDemo {
    public static void main(String[] args)  {
       // method();
        try {
            method2();
        } catch (ParseException e) {
            e.printStackTrace();
        }
        System.out.println("程序结束");
    }

//    private static void method()throws ArithmeticException {
//        int a = 10;
//        int b = 0;
//        System.out.println(a / b);
//    }

    private static void method2() throws ParseException {
        String day = "2020-11-29";
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM--dd");
        Date date = sdf.parse(day);
    }
}

根据演示案例,我们知道

​ 编译时异常抛出:调用者必须处理

​ 运行时异常抛出:调用者可以不处理

throws 和 throw

案例

/**
 * throws 演示案例
 */
public class ThrowsDemo {
    public static void main(String[] args)  {
       // method();
        method3();
//        try {
//            method2();
//        } catch (ParseException e) {
//            e.printStackTrace();
//        }
        System.out.println("程序结束");
    }

//    private static void method()throws ArithmeticException {
//        int a = 10;
//        int b = 0;
//        System.out.println(a / b);
//    }

    private static void method2() throws ParseException {
        String day = "2020-11-29";
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM--dd");
        Date date = sdf.parse(day);
    }

    private static void method3()throws ArithmeticException {
       int a = 10;
        int b = 1;
        if (b == 0) {
            throw new ArithmeticException();
        } else {
            System.out.println(a / b);
        }

   }
}

总结:

throw:

​ 1.方法体内,后面跟异常对象

​ 2.只能抛一个异常

​ 3.执行throw,表示一定有异常抛出

throws:

​ 1.方法声明上,后面跟异常类名

​ 2.可以抛多个异常,用,隔开

​ 3.throws,表示可能有异常抛出

finally

概述:

被finally包裹的代码一定会被执行,但是,JVM退出

面试题

1.final,finally,finalize的区别?

final:它表示最终的,可以 类,成员变量,成员方法

​ 类:表示最终类,不能被继承

​ 成员变量:常量,不能被赋值

​ 成员方法:最终方法,不能被重写

finally:它是 异常处理中try…catch…finally结构的一部分,这部分代码最终都会被执行,除了JVM退出。它一般用于释放资源

自定义异常:

注意事项:

1.自定义异常类必须继承Exception或RUntimeException

2.在其有参构造中,一定要指定访问父类的有参构造,这样才能把异常信息打印到控制台上

异常注意事项:

1.子类在重写父类方法时,子类的方法必须抛出相同的异常或父类异常的子类异常

2.如果父类抛出多个异常,子类重写父类方法时,只能抛出相同的异常或父类异常的子集,并且子类不能抛出父类中没有抛出的异常

3.如果被重写的方法没有抛出编译时异常,那么子类绝对不能抛出任何编译时异常,如果重写方法中有异常需要处理,只能选择try-catch,不能throws

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

IO流(异常的处理) 的相关文章

  • 今天发现rabbitMQ消息堆积

    发现有三十多万的消息堆积在10的queue里没有被消费 记录一下查看问题的步骤 1 jps 找出程序的PID 2 jstack PID 查看线程dump 发现rabbitMQ的consumer worker线程block住了 Thread
  • 黑马程序员---从头开始,回忆JAVA基础之JAVA用十六进制表示浮点数的方法

    在二进制文件中 存储数据的格式为16进制 下面举例说明27 0f在二进制文件中怎么表示 float 共计32位 折合4字节 由最高到最低位分别是第31 30 29 0位 31位是符号位 1表示该数为负 0反之 30 23位 一共8位是指数位
  • mac上使用IntelliJ IDEA运行项目

    一 Mac OSX系统下安装Tomcat 1 下载Tomcat官方下载地址 2 解压Tomcat到目录 Library 中 并把文件夹名由 apache tomcat 6 0 16 改为 Tomcat 3 打开 应用程序 Applicati
  • 3、Java的If语句与For循环

    一 语句 条件语句 根据不同的条件 执行不同的语句 if if else if else if if else if else if else switch 循环语句 重复执行某些动作 for while do while 1 1 if语句
  • JAVA: quakus程序运行

    mvnw compile quarkus dev
  • 使用jemeter进行压力测试关注的指标

    一 压测设置 线程数 并发数量 能跑多少量 具体说是一次存在多少用户同时访问 Rame Up Period in seconds 表示JMeter每隔多少秒发动并发 理解成准备时长 设置虚拟用户数需要多长时间全部启动 如果线程数是20 准备
  • 动力节点老杜java基础视频笔记第一章 学前准备 (1)

    课堂截图 为什么使用截图工具 在听课的过程中 有的时候老师操作的比较快 通过截图的方式将老师的操作保存下来 以便后期的操作 另外截图之后的图片也可以用于笔记的记录 在笔记当中最好采用图文并茂的方式 这样更加利于知识的回顾 使用哪个截图工具
  • 接口如何实现多态

    抽象类是用来继承的 不能被实例化 抽象类里可以有成员变量 接口中没有 1 抽象类里的抽象方法 只有在子类实现了才能使用 2 抽象类里的普通方法 可被子类调用 3 接口里的方法 都被默认修饰为public abstract类型 4 接口里的变
  • 剑指offer第二版面试题20:表示数值的字符串(java)

    题目描述 请实现一个函数用来判断字符串是否表示数值 包括整数和小数 例如 字符串 100 5e2 123 3 1416 和 1E 16 都表示数值 但是 12e 1a3 14 1 2 3 5 和 12e 4 3 都不是 分析 1 在数值之前
  • java数组学习

    2021 2 2 数组 一维数组的使用 1 一维数组的声明和初始化 2 如何调用数组的指定位置的元素 3 如何获取数组的长度 4 如何遍历数组 5 数组元素的默认初始化值 6 数组的内存解析 package day01 import jav
  • Java Json 数据下划线与驼峰格式进行相互转换

    概述 今天遇见一个需求 需要对json数据进行下划线与驼峰格式之间进行转换 在Fastjson Jackson Gson都提供了转换的方式 在这里进行一下列举 User类 public class User private String n
  • java Map集合

    目录 一 介绍 二 HashMap 三 TreeMap 四 LinkedHashMap 一 介绍 Java中的Map是一种键值对的集合数据类型 用于存储无序的 不重复的键值对 它提供了快速的查找和访问功能 可以根据键来获取值 常见的Map实
  • ThreadLocal学习

    1 threadLocal图解 java lang ThreadLocal类实现了线程的本地存储 ThreadLocal的内部实现 ThreadLocal的内部实现包括一个类似HashMap的对象 这里称之ThreadLocalMap Th
  • Java中的IO流如何理解——精简

    目录 引言 缓冲流 字节缓冲流 字符缓冲流 转换流 字符输入转换流 字符输出转换流 序列化和反序列化 对象序列化 对象反序列化 打印流 Properties 引言 通过前面的简单学习 我们已经能够大致了解了关于文件的操作 但是能够明显感受到
  • 各种注释总结

    jsp注释 html注释
  • 对接百度api的工具类:Base64Util,FileUtil,HttpUtil

    对接百度api的工具类 Base64Util FileUtil HttpUtil package com baidu ai aip utils Base64 工具类 public class Base64Util private stati
  • java 模拟库存管理系统

    本案例要求编写一个程序 模拟库存管理系统 该系统内容主要包括 商品入库 商品显示 和删除商品功能 此程序用手机举例 此管理系统分别为两个类Phone 和Test类 Phone类 确定四个变量 类 1 生成空参数构造方法 2 全部参数的构造方
  • Java对象的快速复制的几种方式

    浅拷贝 深度复制 BeanUtils copyProperties 对象的克隆是指创建一个新的对象 且新的对象的状态与原始对象的状态相同 当对克隆的新对象进行修改时 不会影响原始对象的状态 注释 clone 是object类的protect
  • 关于svn如何上传一个完整的项目

    注意 请一定要按照该步骤进行操作 请上传新项目时将项目名称进行规范命名 例如原始文件是arrange v2 将此项目需要注入新的医院 则命名为 arrange 某医院名称 门诊或者医技或者药房 v2 重新命名文件夹名称快捷键 F12 一 先
  • mysql无法连接问题及其环境变量配置

    问题 Can t connect to MySQL server on localhost 3306 10061 方案一 不推荐 第一 在环境变量 系统变量的path中添加mysql的bin目录 我的是D mysql mysql 8 0 2

随机推荐

  • 周志华《机器学习》课后习题解答系列(六):Ch5.10 - 卷积神经网络实验

    本系列相关答案和源代码托管在我的Github上 PY131 Machine Learning ZhouZhihua 卷积神经网络实验 手写字符识别 注 本题程实现基于python theano 这里查看完整代码和数据集 1 基础知识回顾 1
  • 使用PowerShell脚本来一键开启、关闭FTP服务

    可以使用PowerShell脚本来实现这一目标 下面是两个简单的PowerShell脚本 一个用于开启FTP服务 另一个用于关闭FTP服务 开启FTP服务 保存以下脚本为 Enable FTP ps1 开启IIS和FTP功能 Enable
  • Nextjs 的 App Router 路由模式核心概念简介

    Nextjs App Router 简介 Next js 13 引入了新的应用路由器 它建立在服务端组件之上 支持布局 嵌套路由 加载状态 错误处理等等 本文将介绍 App Router 新路由模型的基本概念 术语 树 Tree 一种用于可
  • neo4j--Cypher语法练习(LOAD CSV)

    1 21 LOAD CSV LOAD CSV用于从CSV文件中导入数据 CSV文件的URL可以由FROM后面紧跟的任意表达式来指定 需要使用AS来为CSV数据指定一个变量 LOAD CSV支持以gzip Deflate和ZIP压缩的资源 C
  • el-form表单回车提交,浏览器会刷新页面

    当el from 只有一个输入框时候 回车提交表单 刷新页面 原因 由于当表单只有一文本框时 按下回车将会触发表单的提交事件 从而导致页面刷新 解决办法 在 el from 加上 submit native prevent
  • 【经典】华为远程机试题分享(跟进)

    在上一篇博客中有说到面试的具体事儿 昨晚那种方法做出来之后 感觉可读性不好 也就是一般情况下很难看懂代码 所以接近睡着时我又想到一个办法比较简单 而且易懂 所以写这篇博客和大家分享一下吧 具体就围绕下图这个核心问题来做 其实我的想法很简单
  • 【Espruino】NO.18 使用L298N驱动直流电机

    http blog csdn net qwert1213131 article details 38584743 本文属于个人理解 能力有限 纰漏在所难免 还望指正 小鱼有点电 Espruino中文社区 小学时代玩过玩具四驱车 各种奇葩霸气
  • ChatGPT写小论文

    ChatGPT写小论文 只是个人对写小论文心得 从知乎 知网自己总结的 有问题 可以留个言我改一下 别删我的东西啊CSDN 文章目录 ChatGPT写小论文 1 写小论文模仿实战 狗头 0 小论文组成 1 好论文前提 2 标题 3 摘要 4
  • Transformer(三)--论文实现:transformer pytorch 代码实现

    转载请注明出处 https blog csdn net nocml article details 124489562 本系列传送门 Transformer 一 论文翻译 Attention Is All You Need 中文版 Tran
  • games101笔记 Shading

    什么是shading 不同的物体应用不同的材质的过程 就是计算出物体具体应该在的地方 物体的光照 物体本身应该有的材质 Blinn Phong Reflectance Model Blinn Phong反射模型 Blinn Phong Re
  • MySql执行顺序及执行计划

    一 mySql的执行顺序 mysql执行sql的顺序从 From 开始 以下是执行的顺序流程 1 FROM table1 left join table2 on 将table1和table2中的数据产生笛卡尔积 生成Temp1 2 JOIN
  • Spring和springMVC启动流程

    首先Spring是建立在Servlet容器之上的 所有web工程的初始位置都是在web xml文件中 它配置了servlet的上下文 context 和监听器 listener spring的启动过程其实就是ioc的启动过程 1 首先初始化
  • linux下出现ping:unknown host www.baidu.com问题时的解决办法——ubuntu下局域网络的配置

    如果ping域名的时候出现ping unknown host xxx xxx 但是ping IP地址的时候可以通的话 可知是dns服务器没有配置好 查看一下配置文件 etc resolv conf 里面是否有nameserver xxx x
  • 算力和硬件的关系_算力就是生产力:中国AI算力占全球三成

    12月15日 IDC与浪潮集团联合发布了 2020 2021中国人工智能计算力发展评估报告 报告从旨在评估中国人工智能发展的现状 为推动产业AI化发展提供极具价值的参考依据和行动建议 据报告显示 预计2020 年中国AI市场规模将达到 62
  • chatgpt(0)-pycharm-vscode安装使用插件Codeium-bito

    1 pycharm codeium 下载插件 codeium 登录 一直出现 Log In Codeium Free AI Code Completion Chat 2 pycharm bito 3 vscode bito 下载安装 注册登
  • 十六进制加法

    十六进制加法逢16进1位 注意 进位的那个位是 和 16 举例 0x21 0x3F 60 而不是 0x21 0x3F 6F
  • Proguard混淆工具使用方法图文说明

    Proguard的理论知识请看这篇文章 http www cnblogs com cr330326 p 5534915 html 1 下载Proguard 官网地址 http proguard sourceforge net 不墙很难打开
  • Sonar代码质量管理

    一 简介 1 1 什么是Sonar Sonar是一个用于代码质量管理的开源平台 用于管理代码的质量 是一个Web系统 展现了静态代码扫描的结果 通过插件形式可以支持二十几种语言的代码质量检测 通过多个维度的检查了快速定位代码中潜在的或者明显
  • fopen 参数'rb' 与'rb+'引发的黑色血案

    目录 一 背景 二 代码说明 1 下面是出错的代码 2 如何变正常的 三 问题分析 1 关于rb与rb 的区别 2 关于fread的两种形式说明 3 原因分析 一 背景 为了把windows上的算法库移植到linux上 文件读写部分去掉了C
  • IO流(异常的处理)

    IO流 概述 IO流 又叫输入输出流 当我们将内存中的数据写到硬盘上时 这个过程叫输出流 Output 当我们将硬盘上的数据读取到内存中时 叫做输入流 Input 流本身是一个抽象概念 是 对数据传输的总称 也就是说 数据在设备键的传输 叫