即使 Java 中存在空检查,Sonarqube 仍会显示 NullPointerException 错误

Sonarqube shows NullPointerException bug even after null check is present in Java

Sonarqube 说这段代码中有 2 个主要错误,在 if 条件的第二条语句上。

第一个:

A "NullPointerException" could be thrown; "getResponseHeaders()" can return null.

第二个:

Result of "getResponseHeaders()" is dereferenced

private ResponseEntity<ErrorResponse> handleHttpStatusCodeException(HttpStatusCodeException exception) {
    ResponseEntity.BodyBuilder response = ResponseEntity.status(exception.getStatusCode());
    if (exception.getResponseHeaders() != null && exception.getResponseHeaders().getContentType() != null) {
        response.contentType(exception.getResponseHeaders().getContentType());
    }
    return response.body(createErrorResponse(exception.getResponseBodyAsString()));
}

有没有办法,我可以更改代码来避免错误?

理论上,另一个线程可能会在您检查 exception.getResponseHeaders() 的结果为非 null 之后但在您第二次调用它之前更改它的结果。这种check-then-act并不总是安全的。

更安全的处理方法是分配给本地

var headers = exception.getResponseHeaders();
if (headers != null) {
    var contentType = headers.getContentType();
    if (contentType != null) {
        response.contentType(contentType);
    } 
}

无论如何,我认为这比您的解决方案更具可读性。

当然,如果你的对象没有被多线程改变或者是不可变的,那么这个警告是误报,可以忽略。