结构

Throwable
 ├── Error(系统级错误)
 └── Exception(程序级异常)
      ├── RuntimeException(运行时异常)
      └── CheckedException(编译期异常)

为什么要分错误和异常?

Java 区分 Error 和 Exception,是为了明确:
哪些问题程序可以处理,哪些问题必须放弃。
OutOfMemoryError、StackOverflow。处理不了
ErrorIOException、NullPointerException。可以通过代码处理

为什么要分成运行时异常和编译时异常?

编译时异常本身不是在编译阶段发生的,只是编译器在提醒你“调用这个方法可能会抛出异常,你必须处理它”
也就是java在设计时,提示开发者代码可能会出现这些错误。
Java 没有把所有异常都设计成编译时异常(Checked Exception),是为了在 程序健壮性开发便利性 之间做平衡

处理

捕获异常(try-catch)
声明抛出异常(throws)

throw就是直接抛出异常。

Java 官方库的方法需要我们处理异常,是因为它们在设计时就声明了 throws,而 Java 异常本身是在底层代码里通过 throw 抛出来的。

理解

异常是每个请求独立发生的,本次请求出现异常只影响当前请求线程,下次请求不会受到影响。

如果spring没有处理异常,就会返回500的响应,例如:

HTTP/1.1 500 Internal Server Error
Content-Type: application/json
Content-Length: ...

{
  "timestamp": "2026-03-24T10:00:00.000+00:00",
  "status": 500,
  "error": "Internal Server Error",
  "exception": "java.lang.ArithmeticException",
  "message": "/ by zero",
  "path": "/api/divide"
}

如果自己处理了,就可以自定义返回信息,最终返回的状态码会是200。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐