JavaSE学习笔记_第十章_异常

第10章 异常

1. 异常概念

在 《Java 编程思想》 中这样定义,异常:阻止当前方法或作用域继续执行的问题

异常可以看成是一种内建的恢复系统,在程序中拥有恢复点。

2. 异常分类

Java_异常层次结构

Throwable:所有异常的超类

  • Error:错误,跟 JVM 相关的问题,仅靠程序本身无法恢复的严重错误,如:系统崩溃,虚拟机相关错误等等。
  • Exception:异常,跟程序相关的错误,由 Java 应用程序抛出和处理的非严重错误
    • 运行时异常(RuntimeException):在程序运行时才会发生的错误
    • 检查时异常(Checked Exception):在正确的程序运行过程中,很容易出现的、情理可容的异常状况,在一定程度上这种异常的发生是可以预测的,并且一旦发生该种异常,就必须采取某种方式进行处理。
      • 提示:除了 RuntimeException 及其子类以外,其他的 Exception 类及其子类都属于检查异常,当程序中可能出现这类异常,要么使用 try-catch 语句进行捕获,要么用 throws 子句抛出,否则编译无法通过。

Java 规定:

  • 必须捕获的异常,包括 Exception 及其子类,但不包括 RuntimeException 及其子类
  • 不需要捕获的异常,包括 Error 及其子类, RuntimeException 及其子类。

3. 异常处理

3.1 异常处理机制

异常的处理机制:

  • 抛出异常(一直往上抛,最多抛给 JVM,然后 JVM 处理异常,在控制台打印有关错误的信息)
  • 捕获异常

出现异常后,JVM 中会产生:

  • 在堆上 new 出异常对象
  • 当前执行路径终止,弹出对异常对象的引用
  • 异常处理机制接管程序

3.2 捕获异常

Java_捕获异常

示例代码:

try {  
    // 可能会发生异常的程序代码  
} catch (Type1 id1) {  
    // 捕获并处理try抛出的异常类型Type1  
} catch (Type2 id2) {  
    // 捕获并处理try抛出的异常类型Type2  
} finally {  
    // 无论是否发生异常,都将执行的语句块  
}

小结:

try 块:用于监听捕获异常。其后可接零个或多个 catch 块,如果没有 catch 块,则必须跟一个 finally 块。

catch 块:用于处理 try 捕获到的异常。可捕获多个异常,异常与异常之间用 | 隔开

finally 块:无论是否捕获或处理异常,finally块里的语句都会被执行。当在 try 块或 catch 块中遇到 return 语句时, finally 语句块将在方法返回之前被执行。在以下 4 种特殊情况下, finally 块不会被执行:

1)在 finally 语句块中发生了异常。
2)在前面的代码中用了 System.exit() 退出程序。
3)程序所在的线程死亡。
4)关闭 CPU 。

3.3 throw / throws

throw :手动抛出异常

throws :用于在方法签名中声明此方法可能抛出的异常。可抛出多个异常,异常与异常之间用 , 隔开

  • 抛出运行时异常:调用方不用做处理
  • 抛出检查时异常:调用方一定要处理(继续抛出异常或者捕获异常)

4. 自定义异常

基本步骤:

1)创建一个类继承于 Throwable 类或者其子类

2)添加构造方法(无参和有参)

3)在一个方法中使用 throw 抛出异常

4)在另一个方法中捕获并处理异常

简单案例展示:

/**
 * 自定义异常:ATM 取款,余额不足,取款异常
 *
 * @author SuMo
 * @date 2020/8/20 21:46
 */
public class ExceptionTest {

    public static void main(String[] args) {
        System.out.println("取款...");
        ATM atm = new ATM();
        atm.setBalance(5000);
        try {
            atm.getCash(6000);
        } catch (NotEnoughException e) {
            System.out.println(e.getMessage());
        }
    }

}

class ATM {

    private double balance; // 余额

    public double getBalance() {
        return balance;
    }

    public void setBalance(double balance) {
        this.balance = balance;
    }

    public double getCash(double money) throws NotEnoughException {
        if (money > balance) { // 取款金额大于余额
            throw new NotEnoughException("余额不足,取款失败");
        }
        return money;
    }

}

/**
 * 异常类
 */
class NotEnoughException extends Exception {

    public NotEnoughException(String message) {
        super(message);
    }

}

认真、沉着做事,每天进步一小点!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值