使用 @controlleradvice 结合 @exceptionhandler 注解可以捕获全局空指针异常。只需定义一个配置类,在方法上指定 nullpointerexception.class 作为参数,spring boot 就会自动拦截所有未处理的空指针异常并返回统一响应。

如何定义全局异常处理器类
创建一个继承自 Object 的普通 Java 类,并使用 @RestControllerAdvice 或 @ControllerAdvice 注解标记该类。这告诉 Spring 容器扫描此类并将其注册为全局异常处理组件。在该类内部,你可以编写多个方法来处理不同类型的异常,其中处理空指针的方法需要接收 NullPointerException 类型的参数。

import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.http.ResponseEntity;
import org.springframework.http.HttpStatus;
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(NullPointerException.class)
public ResponseEntity<string> handleNullPointerException(NullPointerException ex) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body("发生空指针异常: " + ex.getMessage());
}
}</string>
上述代码中,@RestControllerAdvice 是 @ControllerAdvice 和 @ResponseBody 的组合,适用于 RESTful API。当控制器抛出 NullPointerException 时,handleNullPointerException 方法会被调用,返回状态码 500 和自定义错误消息。开发者可以直接复制此结构到项目中,无需额外配置即可生效。
如何处理其他常见异常以完善全局机制
除了空指针异常,实际开发中常需同时处理 IllegalArgumentException 或 RuntimeException。在同一 @RestControllerAdvice 类中添加新的 @ExceptionHandler 方法即可。每个方法对应一种异常类型,Spring 会根据异常类型精确匹配处理方法。若希望捕获所有未处理异常,可添加一个接收 Exception.class 的方法作为兜底策略。

import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.http.ResponseEntity;
import org.springframework.http.HttpStatus;
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(NullPointerException.class)
public ResponseEntity<string> handleNullPointerException(NullPointerException ex) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body("空指针: " + ex.getMessage());
}
@ExceptionHandler(IllegalArgumentException.class)
public ResponseEntity<string> handleIllegalArgument(IllegalArgumentException ex) {
return ResponseEntity.status(HttpStatus.BAD_REQUEST)
.body("参数错误: " + ex.getMessage());
}
@ExceptionHandler(Exception.class)
public ResponseEntity<string> handleGeneralException(Exception ex) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body("未知错误: " + ex.getMessage());
}
}</string></string></string>
该示例展示了三种异常的处理逻辑:NullPointerException 返回 500,IllegalArgumentException 返回 400,通用 Exception 作为最后防线也返回 500。注意异常处理顺序:更具体的异常应放在前面,因为 Spring 会按声明顺序匹配第一个符合条件的处理器。若将 Exception.class 放在最前,它将拦截所有异常,导致后续特定处理器失效。因此,保持具体异常优先是关键实践。
当空指针发生在嵌套对象深层时如何处理
若空指针源于深层嵌套对象(如 a.getB().getC()),getMessage()返回的信息通常包含完整路径,便于定位。在全局处理器中,可直接使用该消息返回给前端。无需手动检查每一层,因为异常本身已携带堆栈信息。开发者可通过日志记录 ex.printStackTrace() 或集成 SLF4J 进一步调试,但对外接口仍应保持简洁。











