Spring Boot 3.2.0中ErrorResponseException抛出空指针异常问题排查
空指针异常原因
你遇到的NPE是因为Spring Boot 3.2.0对应的Spring Web 6.1.x版本中,ErrorResponseException的super(HttpStatus.NOT_FOUND)构造函数未初始化headers字段。当异常被框架处理时,会调用getMessage()方法,该方法内部尝试执行this.headers.isEmpty()判断,但headers为null,直接触发空指针。
查看ErrorResponseException源码可以确认:
// 只传入HttpStatus的构造函数 public ErrorResponseException(HttpStatus status) { this(status, null, (HttpHeaders) null, null, null); } // 父构造函数中headers直接赋值为传入的null protected ErrorResponseException(HttpStatus status, @Nullable ProblemDetail body, @Nullable HttpHeaders headers, @Nullable String message, @Nullable Throwable cause) { super(message, cause); this.status = status; this.body = body; this.headers = headers; // 此处未做默认值处理 this.messageCode = null; } // getMessage()方法触发NPE的位置 @Override public String getMessage() { StringBuilder sb = new StringBuilder(); sb.append(this.status); if (this.body != null && StringUtils.hasText(this.body.getDetail())) { sb.append(": ").append(this.body.getDetail()); } if (!this.headers.isEmpty()) { // headers为null时调用isEmpty()抛出NPE sb.append(", headers=").append(this.headers); } return sb.toString(); }
解决方法
以下几种方案都可以解决该问题,推荐前两种:
方案1:构造异常时传入空HttpHeaders
修改自定义异常的构造函数,调用父类带headers参数的构造方法,传入HttpHeaders.EMPTY确保headers不为null:
public class PersonNotFoundException extends ErrorResponseException { private static final long serialVersionUID = 1L; public PersonNotFoundException() { super(HttpStatus.NOT_FOUND, null, HttpHeaders.EMPTY); } }
方案2:使用ErrorResponse Builder模式创建异常
通过ErrorResponse.builder()构建异常,这种方式会自动初始化headers为空集合,避免null问题:
public class PersonNotFoundException extends ErrorResponseException { private static final long serialVersionUID = 1L; public PersonNotFoundException() { super(ErrorResponse.builder(HttpStatus.NOT_FOUND).build()); } }
方案3:测试中指定异常实例(辅助验证)
如果测试代码中之前用的是doThrow(PersonNotFoundException.class),改为抛出具体实例(不过这只是测试层面的调整,核心还是要修复异常类本身):
doThrow(new PersonNotFoundException()).when(personService).get(TEST_UUID_1);
内容的提问来源于stack exchange,提问作者Rain1987
相关产品推荐
相关产品推荐

