002.Exception和Error有什么区别!

7

Exception 和 Error 都是继承了 Throwable 类,在 Java 中只有 Throwable 类型的实例才可以被抛出(throw)或者捕获(catch),它是异常处理机制的基本组成类型。

  • Exception 是程序正常运行中,可以预料的意外情况,可能并且应该被捕获,进行相应处理。
    • 可检查(checked)异常:在源代码里必须显式地进行捕获处理,这是编译期检查的一部分
    • 不检查(unchecked)异常:所谓的运行时异常,类似 NullPointerException、ArrayIndexOutOfBoundsException 之类,通常是可以编码避免的逻辑错误,具体根据需要来判断是否需要捕获,并不会在编译期强制要求。
  • Error 是指程序处于非正常的、不可恢复状态。既然是非正常情况,所以不便于也不需要捕获,常见的栈溢出与堆溢出。

注意:

  • 尽量不要捕获类似 Exception 这样的通用异常,而是应该捕获特定异常
  • 除非深思熟虑了,否则不要捕获 Throwable 或者 Error,这样很难保证我们能够正确程序处理 OutOfMemoryError。
  • 不要生吞(swallow)异常:生吞异常,往往是基于假设这段代码可能不会发生,或者感觉忽略异常是无所谓的,但是千万不要在产品代码做这种假设!

Java 每实例化一个 Exception,都会对当时的栈进行快照,这是一个相对比较重的操作。如果发生的非常频繁,这个开销可就不能被忽略了。