2021-09-18 IO中的Exception详解

本文详细介绍了Java异常处理机制,包括Error和Exception的区别、Exception的分类、异常处理方法以及try-catch-finally的使用。此外,还讨论了AutoCloseable接口在自动资源管理中的应用。最后,文章提到了在继承关系中如何正确处理异常以及throw和throws的用法。

 一、java异常处理机制:

java中所有异常的超类为Throwable,其下有两个子类Error和Exception

1、Error和Exception的区别? 

Error是系统级错误,是Java运行环境内部错误或者硬件问题,不能指望程序来处理这样的问题,除了退出运行别无选择。它是java虚拟机抛出的,比如虚拟机内存溢出等 。

Exception是程序需要处理的异常,是由于程序设计的不完善而出现的问题,程序必须进行处理,比如空指针,下标越界等。通常我们程序中处理的异常都是Exception。

2、Exception分类:

1、编码时异常(检查异常)--CheckedException : java语言强制要求处理的所有非运行异常,比如IOException、SQLException等

2.运行时异常 -- RuntimeException :一般由程序逻辑错误引起的,比如算数异常,空指针异常。

3、异常图:

4、异常的处理方法:捕获、抛出

当我们调用一个含有throws声明异常抛出的方法时,编译器要求我们必须处理这个异常,否则编译不通过。 处理手段有两种:

1、使用try-catch捕获并处理这个异常。 

2、使用throws声明该异常的抛出给调用者解决。 具体选取那种取决于处理异常的责任问题。

二、try-catch-finally捕获

1、try-catch:

一般情况下我们可以捕获一个超类异常:

1、当try中出现了几种不同的异常,但是他们的解决办法相同

2.在最后一个catch处捕获Exception可以避免因为一个未处理的异常导致程序中断

需要注意的是:多个catch的异常之间若存在继承关系,一定要先捕获子类异常,再捕获超类异常,否则编译不通过。

2、try-catch-finally:

finally是try catch中的最后一块,它可以直接跟在try后面,或跟在一个catch后面。

finally可以保证只要程序执行到try当中,无论try里面的语句是否抛出异常,finally中的代码都必须被执行(除程序直接退出外,如:System.exit(0)则不会执行finally中的代码。)

通常我们将释放资源这类操作放到finally中,比如IO操作后的关闭。

3、语法:

        try {
            //放入可能产生异常的代码,顺序执行
        }catch ( Exception e){
            //如果代码出现异常,则用catch捕获,()传递相应的异常类型实例化
        }finally{
            //执行了try或catch后必须执行finally
        }

4、面试题:请分别说明:final,finally,finalize

 ① final:表示最终的,不可改变的,是一个修饰符。修饰类时为最终类,不可被继承;修饰方法时为最终方法,不可以被子类重写;修饰变量时,变量值不可以改变。

② finally:是java异常处理机制的最后一块,放在try/catch后.可以保证只要程序执行到try当中,无论try里面的语句是否抛出异常,除程序直接退出外,finally中的代码必定会被执行。 

③ finalize:是Object类方法的一种,返回值为void。当垃圾回收器GC不确定存在该对象的更多应用时,由对象的垃圾回收器调用此方法进行回收。

5、两种try-finally易错题:

    /*
    测试try finally:
    调用方法返回值是1:return返回值,顺序执行,try在前执行return 0后,执行finally中的return 1;
     */
    public static int method2() {
        try {
            return 0;
        }finally {
            return 1;
        }
    }

    /*
    调用方法返回值是0:执行try后人会0,再执行finally,x++不会修改try中已经返回的x值;
     */
    public static int method3() {
        int x = 0;
        try {
            return x;
        }finally {
            x++;
        }
    }

三、AutoCloseable

JDK7后,推出了一个新特性:AutoCloseable 自动关闭特性 ,允许我们在IO操作中使用异常处理机制更简洁地完成最后的close操作 。

1、语法:

try(定义需要finally中调用close方法关闭的对象){ * IO操作 * }

catch(Exception e){ * ... * }

以上语法可以在try中的()定义并初始化对象的对象必须实现了java.io.AutoCloseable接口,否则编译不通过。 

注意:javaIO中的流和RandomAccessFile都已经实现了这个接口。在try中的代码是编译器认可的,而不是虚拟机。 编译器在编译上述代码后会在编译后的.class文件中改回try-catch形式。

四、继承关系中的异常:

子类异常必须小于等于父类的异常,包括以下几种情况

public class Father {
    public void doSome() throws IOException, AWTException{  }
}
classSon extends Father {
    ① 与父类抛出相同异常:
//    public void doSome() throws IOException, AWTException{ }
    ② 不抛出任何异常
//    public  void doSome() { }
    ③ 抛出父类的部分异常
//    public void doSome() throws IOException{ }
//    public void doSome() throws IAWTException{ }
    ④ 抛出父类的子类异常
//    public void doSome() throws FileNotFoundException { }
    ⑤ 抛出父类的部分异常+子类异常
//    public void doSome() throws FileNotFoundException, AWTException { }
//
    ⑥ 超类没有的异常不可以抛出:
//    public void doSome() throws SQLException { }//异常,父增或子减
    ⑦ 比超类大的异常不可以抛出:
//    public void doSome() throws Exception{ }//异常,父增或子减

五、throw和throws

throw关键字,用来对外主动抛出一个异常。

1、通常以下两种情况,我们主动向外抛出异常

1、当程序遇到一个满足语法,但是不满足业务要求时,可以跑出一个异常告知调用者。 *

2、程序执行遇到一个异常,但是该异常不应当在当前代码片段被解决时,可以抛出给调用者。

2、 throw和throws区别及联系:

1、throw的位置在方法体里,后面跟的是异常类的实例; throws的位置在方法声明后,后面跟的是异常类名。 

2、throw之后只能抛出一个异常,throws可以同时抛出多个异常,中间用,隔开。 

3、throws可以和try-catch分情况使用,throw不可以。

4、联系:如果方法中有throw抛出的RuntimeException异常及其子类对象,则方法声明上可以没有throws; 除此之外,方法声明上必须有throws;

    public void setAge(int age) throws IllegalAgeException {
        if ( age<0 || age>200 ){
            throw new IllegalAgeException("年龄不合法");
        }else {
            this.age = age;
        }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值