Java Sonar Null警告“返回空值,但应为布尔值”

时间:2018-10-24 07:37:42

标签: java sonarqube boolean

如何以不发出声纳警告的方式将此代码块编辑为可读或逻辑。 我需要三个结果为false,true或null

 public Boolean x() {
    if (...) {
        return true;
    } else if (...) {
        return false;
    } else {
        return null;
    }
}

3 个答案:

答案 0 :(得分:2)

尽管您可以返回null,但至少应根据squid:S2447

  

尽管null从技术上讲是一个有效的布尔值,但事实上,Booleanboolean之间的区别很容易忘记。因此,从null方法返回Boolean可能会导致调用者代码出现问题。

如果您不同意,可以在本地禁用它:

return null;//NOSONAR

或完全在设置中停用此规则

也在sonar group中进行了讨论:

  

许多规则还批评了我个人认为不好的事情,即“不应从“布尔”方法返回null(squid:S2447)”。因此,我可能没有给出好的建议。

Sonar community问题:

  

我建议对此有一个额外的规定。

     

因此不应该这样检查布尔值:

Boolean flag = service.getFlag();
// that's the unsafe call which could cause a null pointer exception
if(flag) {
     // do something
}

已回答:

  

不是引入新规则,而是使用S2447:不应该从防止方法返回布尔对象返回空值的“布尔”方法1中返回空值?

答案 1 :(得分:1)

从Java 8开始,使用Optional来编码TRUE,FALSE和Optional.empty。它遵循“避免返回null”模式,同时将禁止SonarQube警告。

代码应该是

public Optional<Boolean> x() { 
    if (...) { 
       return Optional.of(Boolean.TRUE); 
    } 
    else if (...) { 
       return Optional.of(Boolean.FALSE); 
    } 
    else { 
       return Optional.empty(); 
    } 
} 

答案 2 :(得分:0)

此外,由于使用了Optional,我不必检查null控制。

例如:我的第一个代码块

    public Boolean x() {
    if (...) {
        return true;
    } else if (...) {
        return false;
    } else {
        return null;
    }
}

public void y() {
    Boolean result = x();
    if (result != null && result == true) {
        System.out.println(true);
    } else if (result != null && result == false) {
        System.out.println("false");
    } else {
        System.out.println("null");
    }
}

之后,使用可选的我的代码

    public Optional<Boolean> x2() {
    if (...) {
        return Optional.of(Boolean.TRUE);
    } else if (...) {
        return Optional.of(Boolean.FALSE);
    } else {
        return Optional.empty();
    }
}

public void y2() {
    Optional<Boolean> result = x2();
    if (result.equals(Optional.of(Boolean.TRUE))) {
        System.out.println(true);
    } else if (result.equals(Optional.of(Boolean.FALSE))) {
        System.out.println("false");
    } else {
        System.out.println("null");
    }
}

我删除了空控件