Java异常体系

Featured image

异常指的是在程序运行中不期望发生的事件。

异常类及继承关系

Throwable是一个java类,而不是接口,其实现了Serializable接口;
Error:表示一些比较严重的错误,这种错误往往是虚拟机层面的错误,不应该由应用程序所处理(实际上可以捕获,但是一般也很难处理);如OutOfMemoryError,NoSuchMethodError,StackOverflowError,NoclassDefFoundError等
Exception:
IOException、

RuntimeException:
NullPointerException、ArrayIndexOutOfBoundsException、ClassCastException

异常的处理

  1. 尽量不要捕获通用异常,第一代码可读性不好,第二可能会捕获未知异常,而这时候的处理方式未必正确;
  2. 对于异常,最好由详尽的记录,不要直接忽略;最简单的方式是记录日志,但需要注意,e.printStackTrace();不应该被线上所使用
  3. 异常的处理,如果没有合适的处理方式,不妨直接抛给上层,因为上层信息更多,更接近业务,所以可能会有更好的处理方式;
  4. 异常之后的日志记录切忌输出敏感信息
  5. 设计异常时,需要考虑是否设计为check类型的异常,一般check类型的异常都是明确的,异常发生后,程序有可能通过正确的处理来进行恢复。

性能影响

  1. try catch代码块会影响JVM对代码的优化,所以尽量只捕获有必要的代码,不要一个try包含一大段代码。
  2. 每实例化一个Exception,需要对生成堆栈快照。这个操作性能消耗也是比较大的。很多时候服务变慢的原因就是创建大量Exception实例造成的。