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

问题描述 投票:0回答:1
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,我做错了什么吗?

java sonarqube
1个回答
0
投票
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
,您的代码可能会更清晰。

© www.soinside.com 2019 - 2024. All rights reserved.