如何处理 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代替
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
.
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代替