二者都继承了Throwable类。
顾名思义,在Java中,只有Throwable类型才可以被抛出(throw)或者捕获(catch),它是异常处理机制的基本组成类型。
二者的区别在于:

  • Exception是程序正常运行中,可以预料的意外情况,这种意外可能且应该被捕获,并进行相应处理;
  • Error是预料之外的意外情况,绝大部分Error都会导致程序处于异常的、不可恢复的状态,不需要捕获,如Error的子类之一:OutOfMemoryError。

Exception

Exception分为可检查(checked)异常和不检查(unchecked)异常。
可检查异常在源代码里必须显式地进行捕获处理,是编译器检查的一部分。
不检查异常即所谓运行时异常,如NullPointerException、ArrayIndexOutOfBoundsException等,通常可以编码避免,具体根据需求来判断是否需要捕获,不在编译器强制要求。
不可查的Error属于Throwable,不属于Exception。

继承关系

Exception & Error - 图1

异常处理基本原则

  1. 不要捕获Exception这样的通用异常,要捕获特定异常;
  2. 不要生吞(swallow)异常。

Throw early, cache late原则

如使用Objects.requireNonNull(...)判断一下对象是否为空,及时抛出异常。