Java 异常与IO流

Wesley13
• 阅读 641

一、异常

  想想一下代码会发生什么?

public static void main(String[] args) {
        
        int a = 10;
        int b = 0;
        System.out.println(a/b);
        System.out.println("程序结束");
    }

我们都知道,当分母不能为0,所以程序会报错,这是非编译错误。

1、异常的概念:

程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常。

异常是程序中的一些错误,比如说,你的代码少了一个分号,那么运行出来的结果是提示是错误:Java lang Error ;如果你用System.out.println(11/0),那么你是因为你用了0做了除数,会抛出java.lang.Arithmetic Exception 的异常。

异常发生时,是任程序自生自灭,立刻退出终止,还是输入错误给用户?

Java提供了优秀的解决办法:异常处理机制。

2、异常体系结构

  异常处理机制能让程序在异常发生时,按照代码的预先设定的异常处理逻辑,针对性的处理异常,让程序最大可能恢复正常并继续执行,且保持代码的清晰。

Java  异常与IO流

3、异常的分类

  throwable类

Error 表示JVM异常,通常很少出现,也不需要程序员去处理

Exception

RuntimeException 运行时异常,(非检查异常)

IOException (检查异常,除了Error和RuntimeException之外的都是检查异常)

4、异常的使用

对于异常,我们有三种处理方法

1、捕获异常

try{

//可能出现异常的代码段

}catch(ExceptionName e){

//对异常进行处理的代码段

}finally{

//不管发不发生异常,都执行该模块下的内容

}

示例:

public static void main(String[] args) {
        
        int i = 10;
        int j = 0;
        
        try{        //首先程序进入try中,如果try中的代码没有出现异常,就执行try中的代码,然后打印程序结束
            System.out.println(i/j);
        }catch(ArithmeticException e){        //当try中带代码出现异常,就会执行catch中的代码,然后打印程序结束
            System.out.println("分母不能为0");
        }
        System.out.println("程序结束");
    
    }

控制台打印结果:分母不能为0

程序结束

  2、声明异常

在方法中使用throws关键字声明异常

示例:

/**
     * 在方法上声声明一个异常
     * @param args
     * @throws ArithmeticException
     */
    public static void main(String[] args) throws ArithmeticException {
        
        System.out.println(11/0);
    }

  3、抛出异常

    try{

//可能出现异常的代码段

}catch(ExceptionName e){

throw new Exception();

}

示例:

/**
     * fun方法在main方法中调用,可以选择捕获异常,也可以选择继续往外抛异常
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {    //在这里继续把异常往外抛
        fun(11,0);
    }
    
    /**
     * 在方法中声明创建一个异常,并往外抛异常
     * @param i
     * @param j
     * @throws Exception
     */
    public static void fun(int i ,int j) throws Exception{
        try{
            System.out.println(i/j);
        }catch(ArithmeticException e){
            throw new Exception("分母不能为0");
        }
        
    }

5、多重catch块

示例:

public static void main(String[] args) {
        
        try {
            String[] arr = null; 
            System.out.println(arr[0]);
            FileInputStream io = new FileInputStream("");
        }catch (FileNotFoundException e){ 
            System.out.println(" 文件没找到 "); 
        }catch(NullPointerException e){
            System.out.println(" 对象为空 ");
            System. out.println(" 对象为空 "); 
        }
    }

在安排catch语句的顺序时,首先应该捕获最特殊的异常,然后再逐渐一般化,即先子类后父类。

6、常见的异常类型

Java  异常与IO流

二、IO流

1、File类

  File类没有指定信息怎么从文件读取或向文件存储;它描述了文件本身的属性。

File对象用来获取或处理与磁盘文件相关的信息,例如权限,时间,日期和目录路径。

(1)、File类访问文件

File f1 = new File(文件路径(是一个字符串));

//在指向物理文件或目录时,我们路径的 \ 要换成 / 或者 \\

创建文件对象————>指向物理文件或目录

2、File类常用的方法

public static void main(String[] args) {
        
        //创建一个文件对象
        File f1 = new File("D:/abc.txt");
        
        //判断文件是否存在    结果是boolean类型
        System.out.println(f1.exists());
        
        //判断文件是否只读    结果是boolean类型
        System.out.println(f1.canWrite());
        
        //删除文件        f1.delete();
        
        // 获取绝对路径下的文件
        System.out.println(f1.getAbsolutePath());
        
        // 获取绝对路径
        System.out.println(f1.getAbsolutePath());
        
        // 获取文件名
        System.out.println(f1.getName());
        
        // 获取目录路径
        System.out.println(f1.getParent());
        
        // 获取路径
        System.out.println(f1.getPath());
        
        // 判断该文件是否是目录
        System.out.println(f1.isDirectory());
        
        //判断该文件是否是文件
        System.out.println(f1.isFile());
        
        // 判断是否为隐藏文件
        System.out.println(f1.isHidden());
        
        // 获取该文件的字节数 /大小
        System.out.println(f1.length());
        
        //获取路径下的所有文件名
        String [] str = f1.list();
        //使用for each 打印文件名
        for(String s : str){
            System.out.println(s);
        }
        
    }

3、  IO流

流是一个很形象的概念,当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数据源可以是文件,内存,或者网络连接。类似的,当程序需要写入数据的时候,就会开启一个通向目的地的流。

在整个java.io包中最重要的就是5个类和一个接口。5个类指的是File、OutputStream、InputStream、Write、Reader;一个接口指的是Serializable。掌握了这些IO的核心操作那么对于Java中的IO体系也就有了一个初步的认识了。

  Java  异常与IO流

4、IO流体系与分类

  在JAVA中,所有流相关的内容全部在java.io包下。

按功能分,IO流可分为:输入流和输出流

Java程序读取数据  <——(输入流)———文件

Java程序输出数据————( 输出流 )———>文件

按类型分,IO流可分为:字节流和字符流

字符输入流 Reader        字符输出流  Write

字节输入流  IuputStream          字节输出流  OutputStrean

5、IO流划分

这么庞大的体系里面,常用的就那么几个,我们把它们抽取出来

BufferedReader

Reader   InputStreamReader       FileReader

BufferedWriter

字符流

BufferedWriter

Writer

OutStreamWriter         FileWriter

FileInputStream

InputStream          BufferedINputStream

字节流

FlieOutputStream

OutputStream        BufferOutputStream

6、字节流与字符流

程序中输入输出都是以流的形式保存的,流中保存的实际上全都是字节文件。

字符流处理的单元为2个字节的Unicode字节,分别操作字符、字符数组或字符串

字节流处理单元为1个字节,操作字节和字节数组

如何选择字节流和字符流?

字符流是Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成的,所以它对多国语言支持性比较好!如果是音频文件、图片、歌曲、就用字节流好点,如果是关系到中文(文本)的,用字符流好点

7、文件读写步骤

文本文件的读写

1.使用File类打开一个文件

2.通过字节流或字符流的子类,指定文件的位置

3.进行读/写操作

4.关闭输入/输出

常用流有  FileInputStream  和  FileOutputStream ,Bufferedreader  和 BufferedWriter

二进制文件的读写

步骤与文本文件的读写相同,区别在于二进制文件通常使用的是DataInputStream 和 DataOutputStream读写二进制文件

示例:

public static void main(String[] args) throws IOException {
        
        //创建一个文件对象
        File f = new File("D:/abc.txt");
        
        // 输入流
        FileInputStream in = new FileInputStream(f);
        
        //输出流
        FileOutputStream out = new FileOutputStream("D:/123.txt");
        
        byte [] b = new byte[(int) f.length()];
        
        //输入
        in.read(b);
        
        //输出
        out.write(b);
        
        //先关闭out
        out.close();
        
        //在关闭in
        in.close();
        
    }

首先,我们D盘中有一个abc.txt文件,内容是123456

程序运行结束后,D盘会多出一个123.txt的文件,内容也是123456

Java  异常与IO流

8、使用字节流读写文件

FileInputStream : 单字节读写,字节数组读写

FileOutputStream

BufueredInputStream : 使用缓冲区读取,速度比FileInputStream快

BufferedOutputStream

示例:

public static void main(String[] args) throws IOException {
        
        
        //创建一个输入对象
        File fin = new File("D:/jdk api 1.8.CHM");
        
        //字节流缓冲区输入
        BufferedInputStream in = new BufferedInputStream( new FileInputStream(fin));
        
        //创建一个输出的对象
        File fout = new File("D:/jdk api 1.80.CHM");
        //输出
        BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(fout));
        
        byte [] b = new byte[1024];
        
        while(in.read(b) !=-1){
            out.write(b);
        }
        
        //关闭流
        out.close();
        in.close();
    }

程序执行结束,我们会发现,D盘中多了一个我们创建的 jdk api 1.80.CHM 文件

Java  异常与IO流

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表:时辰时间24时制子时深夜11:00凌晨01:0023:0001:00丑时上午01:00上午03:0001:0003:00寅时上午03:00上午0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Stella981 Stella981
3年前
Docker 部署SpringBoot项目不香吗?
  公众号改版后文章乱序推荐,希望你可以点击上方“Java进阶架构师”,点击右上角,将我们设为★“星标”!这样才不会错过每日进阶架构文章呀。  !(http://dingyue.ws.126.net/2020/0920/b00fbfc7j00qgy5xy002kd200qo00hsg00it00cj.jpg)  2
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这