7.2.1 捕获异常

try/catch 语句块:

  1. try {
  2. code
  3. }
  4. catch (ExceptionType e) {
  5. handler for this type
  6. }

image.png

7.2.2 捕获多个异常

image.png

合并 catch:

image.png

7.2.3 再次抛出异常与异常链

可以在 catch 子句中抛出异常:

image.png

将原始异常设置为新异常的 “原因”:

image.png

7.2.4 finally 子句

不管是否有异常被捕获, finally 子句中的代码都会执行.

image.png
image.png

分几种情况:

  • 没有任何异常, 执行顺序: 1, 2, 5, 6
  • try 抛出异常, catch 捕获异常, catch 中不再抛出异常, 执行顺序: 1, 3, 4, 5, 6
  • try 抛出异常, catch 捕获异常, catch 中再抛出异常, 执行顺序: 1, 3, 5
  • try 抛出异常, catch 无法捕获异常, 执行顺序: 1, 5

可以没有 catch:

  • 如果有异常, 那么向上抛出

image.png

finally 中的 return 会覆盖 try 中的 return:

  • 方法返回前会执行 finally 中的语句
  • 不要在 finally 中添加控制流语句
    • return
    • throw
    • break
    • continue

image.png

7.2.5 try-with-Resources 语句

使用 try-with-Resources 需要实现 AutuoCloseable 接口, 语法:

  • try 块退出时自动调用 res.close()
  1. try (Resource res = ...) {
  2. work with res
  3. }

可以指定多个资源:

image.png

Java9 中可以使用事实最终变量:

image.png

try 中的异常被抛出, close 方法抛出的异常会被抑制并使用 addSuppressed() 添加到原来的异常.

7.2.6 分析堆栈轨迹元素

  • Throwable.printStackTrace()
  • StackWalker.StackFrame