ResponseEntity<CommonResponseDTO> commonResponseDto = testClient.getCategoryById(sampleEntity.getCategoryId());
if(Objects.nonNull(commonResponseDto) && Objects.nonNull(commonResponseDto.getBody()) && Objects.nonNull(commonResponseDto.getBody().getName())){
SuperDataDto superDataCategoryDto = SuperDataDto.builder().id(sampleEntity.getCategoryId()).name(commonResponseDto.getBody().getName()).build();
在上面的代码中,sonarQube 抱怨说
A "NullPointerException" could be thrown; "getBody()" can return null. on
.name(commonResponseDto.getBody().getName())
我什至检查了 commonResponseDto.getBody().getName()) 的 nonNUll,我做错了什么吗?
if(Objects.nonNull(commonResponseDto)
&& Objects.nonNull(commonResponseDto.getBody())
&& Objects.nonNull(commonResponseDto.getBody().getName())) {
不保证连续调用的
getBody()
的返回值。这是一个很容易使您的条件抛出的实现:
private int calls = 0;
Body getBody() {
++calls;
if (calls % 2 == 0) return null;
return new Body(...);
}
第一次检查是非空的,第二次调用它将返回空并且你的代码会抛出异常。不要依赖方法从多个调用返回相同的引用,如果您需要单个值,请明确它并将其存储在局部变量中:
if (Objects.nonNull(commonResponseDto)) {
final var body = commonResponseDto.getBody();
if (Objects.nonNull(body) && Objects.nonNull(body.getName()) {
...
请注意,
Objects#nonNull
主要用作 lambda 表达式中的方法引用,如果您简单地编写 obj != null
,您的代码可能会更清晰。