简介

image.png
Java提供了三种可抛出结构:

  • 受检异常(Exception,继承自Throwable)
  • 运行时异常(RuntimeException,继承自Exception)
  • 错误(Error,继承自Throwable)

受检异常

受检异常期望调用者对异常进行处理,或者继续传播出去。方法中声明要抛出的受检异常都是一种潜在的提示:与异常相关的条件是调用这个方法的一种可能结果。如读取文件时,可能会出现IOException(文件没有找到:FileNotFoundException extends IOException extends Exception)

未受检的可抛出结构

运行时异常和错误可以归为未受检的可抛出结构 。两者在行为上是等同的:它们都是不需要也不应该被捕获的可抛出结构。如果程序抛出RuntimeException或Error,往往属于不可恢复的情形,继续执行下去有害无益。如果程序没有捕获这样的可抛出结构,将会导致当前线程停止,并出现适当的错误消息。例如图中的 NullPointerException 就是运行时异常。

RuntimeException通常表明 程序错误 ,大多数的运行时异常都表示 前提违例(precondition violation) 。前提违例是指API调用者没有遵守API规范建立的约定。例如,调用对象为null的方法,会抛出NullPointerException。

Error往往被JVM保留用于表示资源不足,约束失败,或者其他使程序无法继续执行的条件。如OutOfMemoryError、StackOverflowError都继承自Error。由于Error被JVM保留用于表示程序运行错误,因此最好不要实现任何新的Error子类。

Reference

  • Effective Java(第二版)