异常的继承体系结构及处理方式

介绍

  • 指的是程序在执行过程中,出现的非正常的情况,最终会导致JVM的非正常停止

image.png

异常体系

image.png

前提概念:Java中所有的异常都是类

异常的继承体系结构

Throwable
Error:严重级别的问题,常见的有堆栈溢出。
Exception

  1. 运行时异常:RuntimeException及其子类
    - 特点:编译阶段不报错,运行的时候才出错,
  2. 编译时异常:!RuntimeException及其子类
    - 特点:代码语法正确,但是编译就是报错

起到提醒作用,告知使用者这段代码很有可能出错
需要我们对问题给出预处理方案,将来出现问题,直到怎么解决。

异常的处理方式

异常的默认处理流程

  1. 虚拟机会在出现异常的代码那里自动的创建一个异常对象:ArithmeticEtiception
  2. 异常会从方法中出现的点这里抛出给调用者,调用者最终抛出给JVM虚拟机
  3. 虚拟机接收到异常对象后,先在控制台直接输出异常信息数据
  4. 直接从当前执行的异常点干掉当前程序
  5. 后续代码没有机会执行了,因为程序已经噶了
默认异常处理机制
  • 创建一个异常对象,交给调用者处理
  • 最终会交给虚拟机处理
  • 虚拟机处理方式:
    • 将异常信息打印在控制台并停止虚拟机运行

异常处理方式: try...catch...

  • 监视捕获异常,用在方法内部,可以将方法内部出现的异常直接捕获处理。
  • 这种方式还可以,发生异常的方法自己独立完成异常的处理,程序可以继续往下执行

格式:

try {
    可能会出现异常的代码
} catch (异常类名 对象名) {
    异常的处理方式;
}

执行流程:

  1. 执行try{ }中的代码,看是否有问题产生
  2. 有:由catch负责捕获异常,执行异常处理方案,后续代码继续执行
  3. 没有:不执行catch内部的逻辑,代码继续执行

细节补充:

  1. 如果try语句中有多个异常,后面可以跟多个catch
  2. 如果编写了多个catch,最大的异常一定要放最后
  3. JDk7版本开始catch中可以编写多个异常类名,中间使用|进行分隔

**Throwable**类的常见方法:

  • public void printStackTrace(): 展示异常错误信息(位置,异常类名,原因)
  • public String toString(): 异常的简单描述(异常类名,原因)
  • public String getMessage(): 异常的简单描述(原因)
Student stu = new Student();
    Scanner sc = new Scanner(System.in);

    System.out.println("请输入学生姓名:");
    String name = sc.nextLine();
    stu.setName(name);

    System.out.println("请输入学生年龄:");
    while (true) {
        try {
            int age = Integer.parseInt(sc.nextLine());
            stu.setAge(age);
            break;
        } catch (NumberFormatException e) {
            System.out.println("您的输入有误, 请重新输入:");
        }
    }

System.out.println(stu);

异常处理方式: throws抛出

throws: 用在方法上,作用是声明,声明这个方法中有可能会出现异常
思路:两种异常处理方式怎么选?
-线索: 看问题是否需要暴露出来

  1. 需要:抛出
  2. 不需要:`try...catch`捕获
public void setAge(int age) throws Exception {
    if (age >= 0 && age <= 120) {
        this.age = age;
    }else {
        throw new Exception();
    }
}
System.out.println("请输入学生年龄:");
while (true) {
    try {
        int age = Integer.parseInt(sc.nextLine());
        stu.setAge(age);
        break;
    } catch (NumberFormatException e) {
        System.out.println("您的输入有误, 请重新输入:");
    } catch (Exception e) {
        System.out.println("您的输入的年龄范围有误, 请输入0-120之间的年龄:");
    }
}
throwthrows的区别

throw:用在方法中,后面跟的是异常对象,其作用是抛出异常对象
throws:用在方法名后面,起到声明作用
声明此方法中存在异常,调用者需要进行处理
细节:
抛出的异常对象如果是编译时异常,必须使用throws声明
如果是运行时异常,则不需要写throws

自定义异常的必要

  • Java无法为这个世界上全部的问题提供异常类
  • 如果企业想通过异常的方式来管理自己的某个业务问题,就需要自定义异常类了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值