Java 异常体系

77 阅读1分钟

在 Java 中,所有异常和错误都继承自 java.lang.Throwable,它分为两大分支:

  • Error(错误)

    • 表示 JVM 无法处理的严重问题。

    • 常见如 OutOfMemoryError, StackOverflowError

    • 一般不应该捕获或处理,而是避免或修复根本问题。

  • Exception(异常)

    • 表示程序运行过程中出现的可处理事件。

    • 主要分为两类:

      • Checked Exception(受检异常)

        • 编译器强制要求处理(try-catch 或 throws)。

        • 常见:IOException, SQLException

        • 适合用来表示外部资源问题(文件、网络、数据库)。

      • Unchecked Exception(运行时异常,RuntimeException 及其子类)

        • 编译器不强制处理。

        • 常见:NullPointerException, IndexOutOfBoundsException, IllegalArgumentException

        • 通常表示编程错误(逻辑错误、非法参数)。

问题

  1. 出现 OOM,JVM 一定会崩溃吗
    • 结论:不一定,OutOfMemoryErrorError,继承自 Throwable,理论上可以被 try-catch 捕获。但通常也意味着JVM已经处于一种极其不稳定的状态,部分框架(如 Spring, Tomcat)在捕获到 OOM 后会主动关闭应用,避免“僵尸进程”。
  2. try-catch-finally 的执行顺序?
    • try → catch → finally。
    • finally 总会执行(除非 System.exit())。
    • finally 中的 return 会覆盖 try/catch 的 return。