7.2.1 捕获异常
try/catch 语句块:
try {
code
}
catch (ExceptionType e) {
handler for this type
}
7.2.2 捕获多个异常
合并 catch:
7.2.3 再次抛出异常与异常链
可以在 catch 子句中抛出异常:
将原始异常设置为新异常的 “原因”:
7.2.4 finally 子句
不管是否有异常被捕获, finally 子句中的代码都会执行.
分几种情况:
- 没有任何异常, 执行顺序: 1, 2, 5, 6
- try 抛出异常, catch 捕获异常, catch 中不再抛出异常, 执行顺序: 1, 3, 4, 5, 6
- try 抛出异常, catch 捕获异常, catch 中再抛出异常, 执行顺序: 1, 3, 5
- try 抛出异常, catch 无法捕获异常, 执行顺序: 1, 5
可以没有 catch:
- 如果有异常, 那么向上抛出
finally 中的 return 会覆盖 try 中的 return:
- 方法返回前会执行 finally 中的语句
- 不要在 finally 中添加控制流语句
- return
- throw
- break
- continue
7.2.5 try-with-Resources 语句
使用 try-with-Resources 需要实现 AutuoCloseable 接口, 语法:
- try 块退出时自动调用 res.close()
try (Resource res = ...) {
work with res
}
可以指定多个资源:
Java9 中可以使用事实最终变量:
try 中的异常被抛出, close 方法抛出的异常会被抑制并使用 addSuppressed() 添加到原来的异常.
7.2.6 分析堆栈轨迹元素
- Throwable.printStackTrace()
- StackWalker.StackFrame