如何处理 Sonarlint java:S2259(不应取消引用空指针)

how to handle Sonarlint java:S2259 (Null pointers should not be dereferenced)

if (res.getBody() == null || res.getBody().getServiceResult() == null) {
  return; //
}

在上面的代码中, sonarlint 抱怨说 SonarLint:可能会抛出“NullPointerException”; “getBody()”可以 return 为空。 (来自 res.getBody().getServiceResult() )

我认为“res.getBody() == null”首先检查 null,因此它应该转到 return 行,而不是到达下一个 if 条件。

我是不是想错了?

res.getBody() == null || res.getBody().getServiceResult() == null)

当您检查 res.getBody()==null.

时,Sonar 检测到 res.getBody() 可以为空

之后,您再次调用 res.getBody()

第一次可以非null,第二次不可以,sonar不知道这个

要解决此问题,只需执行以下操作:

BodyType body=res.getBody();
if (body == null || body.getServiceResult() == null) {
  return;
}

之后您甚至可以重复使用 body

如果您绝对确定 res.getBody() 保持为 null 并且也没有被另一个线程修改,您还可以使用 //NOSONAR 注释来抑制警告。

好像res也可以为null

尝试

if (res == null || res.getBody() == null || res.getBody().getServiceResult() == null) {
  return; //
}

这么长的getter链也可以用Optional + map + ifPresent lambda style代替