day05--Java面向对象复习--Exception异常

概念:
1.异常是程序在运行期发生的不正常的事件,它会打断指令的正常执行流程。
2.设计良好的程序应该在异常发生时提供处理这些不正常事件的方法,使程序不会因为异常的发生而阻断或产生不可预见的结果
3.Java语言使用异常处理机制为程序提供了异常处理的能力

异常类的由来:
java把运行时出现的各种不正常情况,也看成对象,提取属性和行为进行描述(异常信息、异常名称、异常发生位置),形成了异常类。

分类
错误(Error)
1.JVM系统内部错误或资源耗尽等严重情况,属于JVM需要承担的责任。
2.Error是无法恢复或不可捕获,将导致应用程序中断。

异常(Exception)
1.编译错误或偶然的外在因素导致的一般性问题
2.这类异常在得到恰当的处理时,程序有机会恢复至正常运行状态。
注意:程序员通常只能处理异常(Exception),而对错误(Error)无能为力。

处理机制:
1.Java程序在执行过程中如果出现异常,会自动生成一个异常类对象,该异常对象将被自动提交给JVM,这个过程为抛出(throw)异常。
默认是JVM对异常进行处理,处理方式是打印异常的名称、原因、位置,然后程序中断
eg1:int[] ns=new int[3]; ns[5]=0; //数组下标越界异常,ArrayIndexOutOfBoundsException
eg2: int r=5/0; //除为为0异常,ArithmeticException
因为这种异常在Java中已定义了,所以在发生这种异常时,系统会自动创建异常的对象,
因为main不能处理这种异常,所以抛给了JVM,JVM的默认的处理方式就是调用该异常
类对象的printStackTrace()方法,打印异常名称、原因和异常发生的位置

2.当JVM接收到异常对象时,会寻找能处理这一异常的代码并把当前异常对象交给其处理,这一过程称为捕获(catch)异常和处理异常

3.如果JVM找不到可以捕获异常的代码,则运行时系统将终止,相应的Java程序也将退出。

Exception类
说明:所有异常类的父类
处理:其子类对应了各种各样可能出现的异常事件,一般需要用户显示的声明或捕获。
核心方法:
printStackTrace():打印异常信息、名称、位置
getMessage():获取异常信息
Exception():无参的构造方法
Exception(String detailMessage):带有异常信息的构造方法

IOException类:
说明:是由于IO系统堵塞等原因引起的异常。
1.试图从文件结尾处读取信息
2.试图打开一个不存在或者格式错误的url

子类
FileNotFoundException:文件未找到异常
EOFException:读写文件尾异常
MalformedURLException:URL格式错误异常
SocketException:Socket异常

RuntimeException类
说明:一种特殊的异常,如被0除,数组下表超出范围等
处理:其产生比较频繁,处理麻烦,如果显示的声明或捕获将会对程序可读性和运行效率影响很大。因此由系统自动检测并将它们交给缺省的异常处理程序。

子类:
ArithmeticException:数学计算异常
NullPointerException:空指针异常
NegativeArraySizeException:负数组长度异常
ArrayIndexOutOfBoundsException:数组索引越界异常
ClassNotFoundException:类文件未找到异常
ClassCastException:造型异常

异常的捕获与处理
关键字:try、catch、finally
格式1: try{ 可能发生异常的代码; } catch(异常类 参数) { 处理异常的代码 }
格式2: try{ } catch(..) { } catch(..) { } catch(..) { }
格式3: try{ } catch(…) { } finally{ 必须执行的代码; }
try语句
1、try{ … }语句包含了一段代码,这段代码就是一次捕获并处理异常的范围。
2、在执行过程中,该段代码可能会产生并抛出一种或几种类型的异常对象,它后面的catch语句要分别对这些异常做相应的处理。

catch语句
1、catch语句块中是对异常进行处理的代码,每个try语句块可以伴随一个或多个catch语句,用于处理可能产生的不同类型的异常对象。
2、在catch中声明的异常对象(catch(ExceptionName e))封装了异常事件发生的信息,可以获取或打印异常信息
3、使用多重 catch 语句时,异常子类一定要位于异常父类之前
4、如果没有异常产生,所有的catch段的代码都会被忽略不执行

finally语句
1、finally语句为异常处理提供一个统一的出口,使得在控制流转到程序的其它部分以前,能够对程序的状态作统一的管理
2、无论在try代码块中是否发生了异常事件,finally块中的语句都会被执行。
3、通常在finally语句块中可以进行资源的清理工作
关闭打开的文件
删除临时文件
关闭数据库的连接等
4、finally语句是可选的

注意
1、catch处理的异常,可以是发生异常的父类
2、 finally 的语句块是在 return之间执行的

抛出异常
关键字:throws、throw
throws的使用
说明:在定义一个方法时,使用throws声明此方法不处理异常,而交给方法的调用出进行处理
格式:方法名() throws 异常类列表
注意:异常列表可以是一个异常类,也可以是多个,如果是多个则用逗号“,”分隔

throw的使用
说明:用在方法代码中主动抛出一个异常。
格式: new 异常类名(“异常信息”)
注意:如果方法代码中自行抛出的异常是受检异常,则这个方法要用throws关键字声明这个异常

throws与throw的区别
1、 throw是在方法内部,后边跟的是异常对象
2、trhows是在方法后边,后边跟的是异常类

自定义异常
1、创建类,并继承Exception类
2、重写相关的构造方法,并在构造方法中调用父类的相关构造方法
思考1:老师用电脑上课,可能出现蓝屏、冒烟,从而使得了上课进度受影响了

package homework;

class Teacher {
    String name;
    Computer computer;

    public Teacher(String name, Computer computer) {
        this.name = name;
        this.computer = computer;
    }

    public void reset() {
        System.out.println("电脑重启中...");
    }

    public void work() {

    }
}

class Computer {
    int state;

    public Computer(int state) {
        this.state = state;
    }

    public void run() throws LpException, MyException {
        if (state == 1)
            throw new LpException();
        else if (state == 2)
            throw new MyException();
    }
}

class LpException extends Exception {
    public LpException() {
        super("电脑蓝屏了");
    }

    public LpException(String msg) {
        super(msg);
    }
}

class MyException extends Exception {
    public MyException() {
        super("电脑冒烟了");
    }

    public MyException(String msg) {
        super(msg);
    }
}

public class test1 {
    public static void main(String[] args) {
        Computer computer = new Computer(1);
        Teacher teacher = new Teacher("张三", computer);
        try {
            computer.run();
        } catch (LpException e) {
            System.out.println("电脑蓝屏了");
            teacher.reset();
            // e.printStackTrace();
        } catch (MyException e) {
            System.out.println("电脑冒烟了");
            // e.printStackTrace();
        }
    }

}

思考2:计算圆形和长方形面积,面积小于0认为是异常

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值