第10章 异常
1. 异常概念
在 《Java 编程思想》 中这样定义,异常:阻止当前方法或作用域继续执行的问题 。
异常可以看成是一种内建的恢复系统,在程序中拥有恢复点。
2. 异常分类
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 捕获异常
示例代码:
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);
}
}
认真、沉着做事,每天进步一小点!!!