即使 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);
}
}
无论如何,我认为这比您的解决方案更具可读性。
当然,如果你的对象没有被多线程改变或者是不可变的,那么这个警告是误报,可以忽略。
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);
}
}
无论如何,我认为这比您的解决方案更具可读性。
当然,如果你的对象没有被多线程改变或者是不可变的,那么这个警告是误报,可以忽略。