try/catch/finally
- 如果没有try,异常将击穿所有的栈帧
- catch可以将一个异常抓住
- finally执行清理工作
- JDK+:try-with-resources
- try=>catch=>finally=>return
- try-with-resources -> try-finally
- try-with-resources相当于自动加一个finally块调用了close方法
- try如果没有catch但是发生异常会向上找catch方法块来捕获
throw/throws
- throw抛出一个异常
- throws只是一个声明
Java的异常体系
- Throwable - 可以被抛出的东西(有毒)
- Exception - checked execption(受检异常,有毒,代表
- 一种预料之中的异常,IOException)
- RuntimeException (运行时异常,无毒,代表一种预料之外的异常,因此不需要声明)
- Error (错误,无毒)
- catch的级联与合并 从小到大
Throwable
- 栈轨迹 Stacktrace (排查问题最重要的信息,没有之一)
- 异常链(Caused by)
异常的抛出原则
- 能用if/else处理的,不要使用异常
- 尽早抛出异常
- 异常要准确、带有详细信息
- 抛出异常也⽐比悄悄地执行错误的逻辑强的多
异常的处理原则
- 本方法是否有责任处理这个异常?
- 不要处理不归自己管的异常
- 本方法是否有能力处理这个异常?
- 如果自己无法处理,就抛出
- 如非万分必要,不要忽略异常
了解和使用JDK内置的异常
- NullPointerException
- ClassNotFoundException/NoClassDefFoundError
- IllegalStateException
- IllegalArgumentException
- IllegalAccessException
- ClassCastException
- ...
异常实战
- 从同学的例题说起
- https://github.com/hcsp/http-login-and-use-cookie/
- pull/
- https://github.com/hcsp/fix-simple-npe-of-
- uninitialized-field/pull/
- https://github.com/hcsp/implement-sem-version/
- pull/
- SQLException
「资料来源:饥人谷」