Java 声纳假阳性;更改条件,使其不总是计算为真。”;

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

Sonar正在为下面的代码“更改此条件,使其不总是计算为真”。我咨询过很多人,他们都认为这是假阳性,我们是否遗漏了什么

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。是否可以禁用此特定错误?我不想禁用整个规则。如果不重新处理引擎的大部分,很遗憾不能。我鼓励您以“假阳性”结束此问题