Sonarlint 警告我不要出现可能的 NullPointerException,但在我看来,我采取了必要的措施来防止它?

Sonarlint warns me against a possible NullPointerException, but in my mind, I did what was necessary to prevent it?

提问人:Marc Le Bihan 提问时间:9/1/2023 最后编辑:Marc Le Bihan 更新时间:9/2/2023 访问量:62

问:

我已经编写了这段正常工作的代码,但 Sonarlint 警告我不要使用 on ,它可能会产生 null,它说。wsr.getBody().getWorkspace()NullPointerExceptionwsr.getBody()

public WorkspaceSummary getWorkspace(String workspaceName) {
   try {
      ResponseEntity<GetWorkspaceResponse> wsr = this.workspacesApi.getWorkspaceWithHttpInfo(workspaceName, this.quiet);

      if (wsr == null || wsr.getBody() == null) {
         throw new RuntimeException("getWorkspaceWithHttpInfo a renvoyé une réponse nulle");
      }

      return wsr.getBody().getWorkspace();
   }
   catch(HttpClientErrorException e) {
      [...]
   }
}

enter image description here

但我相信不是。在我看来,我做了必要的事情来防止它。

有时,我们面前的明显事物我们看不到它们,这就是为什么我问你是否错过了什么。

java intellij-idea nullpointerexception sonarlint

评论

2赞 experiment unit 1998X 9/1/2023
不知道这是否会改变任何事情,但是您想尝试将 wsr.getBody() 分配给变量,然后在检查中使用它并返回 variable.getWorkspace() 吗?
0赞 Kayaman 9/1/2023
一件事是 SonarQube 很愚蠢。它会很高兴地报告误报,即使是普通程序员也看到这些误报是不真实的。禁止警告,除非你想“代码舞蹈”来让SQ开心。
0赞 Marc Le Bihan 9/1/2023
@Kayaman我安装了 Sonarlint 是为了发现代码中的问题。我不会停用它的警告。
0赞 Tim Moore 9/1/2023
我会使用@experimentunit1998X的建议将其分配给变量。Sonar可能无法推断出将始终返回相同的结果。wsr.getBody()
0赞 Marc Le Bihan 9/1/2023
@Kayaman您可以在一行上禁止显示某种警告,但允许它出现在您拥有的其他来源的其他地方?我只知道如何完全禁用 sme kind 的警告。在我看来,如果我禁止警告“可能会抛出 NullPointerException”,Sonarlint 不会尝试在我的源中的其他地方进行该检测。

答:

0赞 Marc Le Bihan 9/2/2023 #1

@oferskulsky给出的答案可以按照@experimentunit1998X建议的方式应用,并且可以解决警告。伟大!

ResponseEntity<GetWorkspaceResponse> wsr = this.workspacesApi.getWorkspaceWithHttpInfo(workspaceName, this.quiet);
GetWorkspaceResponse response = (wsr != null) ? wsr.getBody() : null;

if (response == null) {
   throw new RuntimeException("getWorkspaceWithHttpInfo a renvoyé une réponse nulle");
}

return response.getWorkspace();
1赞 Ofer Skulsky 9/2/2023 #2

您假设 war.getBody() 是一致的,并且始终返回相同的值。 Sonar 查看代码,发现您正在重新计算或重新获取该值,因此基本上您没有验证新值,因此该值可以为 null。 如果保存该值,则该值不会发生更改。

评论

0赞 Marc Le Bihan 9/2/2023
这很聪明!是的,这真的是可以理解和明智的。谢谢!