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

roc*_*amp 3 java sonarqube

Sonarqube 表示,这段代码中有 2 个主要错误,即 if 条件中的第二条语句。

第一的:

可能会抛出“NullPointerException”;“getResponseHeaders()”可以返回 null。

第二:

“getResponseHeaders()”的结果被取消引用

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()));
}
Run Code Online (Sandbox Code Playgroud)

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

Mic*_*ael 10

exception.getResponseHeaders()理论上,另一个线程可能会在您检查它非空之后但在您第二次调用它之前更改结果。这种先检查后采取行动的做法并不总是安全的。

处理这个问题的更安全的方法是分配给本地

var headers = exception.getResponseHeaders();
if (headers != null) {
    var contentType = headers.getContentType();
    if (contentType != null) {
        response.contentType(contentType);
    } 
}
Run Code Online (Sandbox Code Playgroud)

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

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