Java 声纳假阳性;更改条件,使其不总是计算为真。”;
Sonar正在为下面的代码“更改此条件,使其不总是计算为真”。我咨询过很多人,他们都认为这是假阳性,我们是否遗漏了什么Java 声纳假阳性;更改条件,使其不总是计算为真。”;,java,sonarqube,code-analysis,sonarlint,Java,Sonarqube,Code Analysis,Sonarlint,Sonar正在为下面的代码“更改此条件,使其不总是计算为真”。我咨询过很多人,他们都认为这是假阳性,我们是否遗漏了什么 public SearchResponse getSearchResponse(SearchRequest searchRequest) { try { searchRequest.validate(); } catch(VerifyException e) { ///some code to make errorResp
public SearchResponse getSearchResponse(SearchRequest searchRequest) {
try {
searchRequest.validate();
} catch(VerifyException e) {
///some code to make errorResp
return errorResp
} catch(Exception e) {
String key = searchRequest != null ? serchReqeust.getKey() : null;
Logger.log("some text {}", key);
//some code to make errorResp
return errorResp;
}
}
在searchRequest!=空
。
然而,若searchRequest为null,try块中的第一行将抛出NullPointerException,若我不在catch块中检查null,它将在catch块中再次中断。让我的方法再次失败,这是我不想要的
编辑:
由于一些人在评论中要求代码来重现错误,我已将其上载到github,在eclipse中的sonar lint 3.4也可以重现该问题。sonar Java analyzer(5.1.1)中的符号执行引擎它提出了一个问题,因为它假定到达
捕获
块的唯一方法是至少让搜索请求
为非空
。这是发动机的一个限制,目前不包括这些情况。以下票证跟踪此限制:
现在,正如您所说的,没有什么可以阻止您调用参数为null
的方法。在这种情况下,将抛出NullPointerException
,实际上,我们将到达catch(异常e)
块,其中searchRequest
为null
SonarJava因此提出了一个假阳性
现在,关于您的实现选择,我相信像这样处理null
-案例(通过依赖抛出的异常)并不是人们通常期望的事情。当输入方法时,显式的null
-检查通常更加清晰,应该是首选
请注意,作为一种良好的实践,我认为使用
@javax.annotation.Nullable
或类似的nullness注释(此注释来自)来注释方法的searchRequest
参数会更清晰。这将有助于其他开发人员(以及SonarJava引擎)了解您可以在何种状态下提供参数,并使其非常清晰。如果(searchRequest!=null),可能需要执行if{
在之前尝试,这样你就知道searchRequest
是好的了吗?Sonar是否假设唯一可能的其他异常是NullpointerException
?也可以看到这个SonarJava的版本是什么?你可以在管理>市场中找到它。key!=null?key:null
=key
@andyTurner实际上是sonar告诉我的第一行try,这意味着searchRequest在异常块中不能为null。是否可以禁用此特定错误?我不想禁用整个规则。如果不重新处理引擎的大部分,很遗憾不能。我鼓励您以“假阳性”结束此问题