跳转至

Error 和 Exception 的区别;CheckedException、RuntimeException 的区别

一、Throwable 体系

Throwable
├── Error
└── Exception
    ├── RuntimeException(非受检)
    └── 其他 Exception(受检)

二、Error vs Exception

Error

JVM 层面的严重问题,程序自身无法恢复:

  • OutOfMemoryError
  • StackOverflowError
  • NoClassDefFoundError
  • VirtualMachineError

不要 catch Error,通常直接退出 JVM。

Exception

程序可以处理的异常。

三、Checked vs Unchecked

Checked Exception(受检异常)

编译期检查,必须 catch 或 throws:

  • IOException
  • SQLException
  • ClassNotFoundException

RuntimeException(非受检异常)

编译期不强制 catch:

  • NullPointerException
  • IllegalArgumentException
  • IndexOutOfBoundsException
  • ClassCastException

四、对比

Checked RuntimeException Error
编译期检查
能否恢复 通常可 不可
例子 IOException NPE OOM
处理 try-catch 或 throws 编程避免 记录日志退出

五、为什么有受检异常

强制调用者处理异常情况。但实际开发中,受检异常被诟病:

  • 方法签名 throws 一堆,调用者麻烦。
  • 很多异常 catch 了也不知道怎么办。
  • Spring 把受检异常转成 RuntimeException。

六、实战建议

  • 业务异常用 RuntimeException 子类。
  • 不要 catch Throwable。
  • 不要 catch Error。

高频追问

  • RuntimeException 也叫 unchecked。
  • Error 不需要 throws 声明。
  • main 方法 throws Exception 只是偷懒,不推荐。