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

在上面的代码中,sonarlint 抱怨 SonarLint: A "NullPointerException" 可能被抛出;“getBody()”可以返回空值。(来自 res.getBody().getServiceResult() )

我认为“res.getBody() == null”首先检查 null 所以它应该去返回行,而不是到达下一个 if 条件。

我想错了吗?

4

2 回答 2

4

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

res.getBody()当您进行检查时,Sonar 检测到可能为 null res.getBody()==null

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

第一次可能是非空的,但第二次不是,声纳不知道这一点。

为了解决这个问题,只需执行以下操作:

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

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

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

于 2021-02-22T05:44:15.037 回答
0

似乎 res 也可以为空。

尝试

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

如此长的 getter 链也可以替换为 Optional + map + ifPresent lambda 样式。

于 2021-02-22T05:57:33.963 回答