• 如果抛出的是受检异常,则必须在方法签名上声明,否则将导致编译错误。
  • 如果抛出的是运行时异常,不需要在方法签名上声明。

受检异常(Checked Exceptions)和运行时异常(Runtime Exceptions)在Java中有一些重要的区别:

  1. 检查时期:

    • 受检异常: 这些异常在编译时期就被检测到,编译器要求程序员在方法签名上使用 throws 关键字声明可能抛出的受检异常,或者使用 try-catch 块来处理这些异常。
    • 运行时异常: 运行时异常是在运行时期被检测到的,编译器不会强制要求在方法签名上声明这些异常。
  2. 处理要求:

    • 受检异常: 必须通过 throws 声明或者 try-catch 块来显式处理。
    • 运行时异常: 可以选择性地进行处理,不强制要求在方法签名上声明或者在调用方进行捕获。
  3. 继承关系:

    • 受检异常: 通常是 Exception 类及其子类,除了 RuntimeException 及其子类。
    • 运行时异常: 通常是 RuntimeException 类及其子类。
  4. 编程错误与环境问题:

    • 受检异常: 通常表示编程错误或外部环境问题,程序员应该通过代码进行处理。
    • 运行时异常: 通常表示程序内部错误,如空指针异常、数组越界异常等,这些通常由程序员在代码中解决。

关于线程的终止:

  • 受检异常: 当一个线程抛出受检异常且未捕获时,该线程的执行会被中断,但程序的其他线程可能仍然继续执行。
  • 运行时异常: 当一个线程抛出运行时异常且未捕获时,同样会导致该线程的执行被中断。在这两种情况下,线程的异常未被捕获,可能会导致线程终止,但不会影响其他线程的执行。