Checked Exception 和 Unchecked Exception 是 Java 编程语言中异常处理机制的两种主要分类方式,它们之间的区别在于编译器对这两种异常的不同处理要求和程序员在编写代码时的处理规范:

  1. Checked Exception(受检异常)
  • 这类异常继承自 java.lang.Exception 类,但不包括 RuntimeException 及其子类。
  • 编译器强制要求程序员显式处理这些异常。也就是说,在可能出现 checked 异常的方法签名中必须使用 throws 关键字声明该方法可能抛出的异常类型。
  • 如果调用的方法可能会抛出 checked 异常,那么调用者要么捕获它(使用 try-catch 语句),要么将异常再次声明抛出到上层调用。
  • Checked Exception 常用于表示可预见的、正常情况下程序应该能够恢复或合理处理的异常情况,如文件未找到 (FileNotFoundException)、网络连接失败等。
  1. Unchecked Exception(非受检异常)
  • 这类异常继承自 java.lang.RuntimeException 类,或者直接继承自 Error 类。
  • 编译器不强制程序员在方法签名中声明这类异常,即无需使用 throws 关键字。
  • 程序运行时如果出现 unchecked 异常,编译器不会报错,但如果异常没有被捕获,程序会终止执行(除非在全局默认的异常处理器中进行了特殊处理)。
  • Unchecked Exception 通常用于指示编程错误或逻辑错误,例如空指针异常 (NullPointerException)、数组越界异常 (ArrayIndexOutOfBoundsException) 等,这些异常通常应当通过修正代码来避免,而不是在每个可能产生异常的地方都进行捕获处理。

总结来说,Checked Exception 强制开发者在编码阶段考虑并处理预期的异常状况,而 Unchecked Exception 则更倾向于反映那些应由程序员在编码阶段避免的运行时错误。