You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 19:27:23