目录
1. 初始异常
异常指的是程序在运行时出现错误时通知调用者的一种机制。
“运行时”指的是程序已经编译通过得到 class 文件了,再由 JVM 执行过程中出现的错误。而有些错误是编译过程中就会出错,这是“编译期”出错。
2. 防御式编程
错误在代码中是客观存在的,要让程序出现问题的时候及时通知程序员,有两种方式。
- LBYL: Look Before You Leap. 在操作之前就做充分的检查。
- EAFP: It's Easier to Ask Forgiveness than Permission. "事后获取原谅比事前获取许可更容易". 也就是先操作, 遇到问题再处理。异常的核心就是 EAFP.
3. 异常的基本用法
3.1 基本语法
try{
有可能出现异常的语句 ;
} catch (异常类型 异常对象) {
...
} finally {
异常的出口
}
其中:
try 代码块中放的是可能出现异常的代码。
catch 代码块中放的是出现异常后的处理行为。
finally 代码块中的代码用于处理善后工作, 会在最后执行。
其中 catch 和 finally 都可以根据情况选择加或者不加。
3.2 为什么要处理异常
程序中如果一旦出现异常,不处理异常,程序就终止了,异常之后的代码段就不会执行。
比如:
但如果进行异常处理,一旦 try 中出现异常,那么 try 代码块中的程序就不会继续执行,而是交给 catch 中的代码来执行。catch 中的代码执行完毕后会继续执行,程序不会停止。这样就有利于程序的执行效率。
关于 "调用栈"
方法之间是存在相互调用关系的, 这种调用关系我们可以用 "调用栈" 来描述。 在 JVM 中有一块内存空间称为 "虚拟机栈" 专门存储方法之间的调用关系。当代码中出现异常的时候, 我们就可以使用 e.printStackTrace(); 的方式查看出现异常代码的调用栈。
3.3 关于异常的处理方式
异常的种类有很多, 我们要根据不同的业务场景来决定。
1. 对于比较严重的问题(例如和算钱相关的场景), 应该让程序直接崩溃, 防止造成更严重的后果。
2. 对于不太严重的问题(大多数场景), 可以记录错误日志, 并通过监控报警程序及时通知程序员。
3. 对于可能会恢复的问题(和网络相关的场景), 可以尝试进行重试。
在我们当前的代码中采取的是经过简化的第二种方式。我们记录的错误日志是出