SonarQube - 布尔逻辑正确性 -

Gab*_*yot 3 java boolean-expression sonarqube

我的方法matches1()上的逻辑表达式有问题.

问题

SonarQube告诉我有一个错误: (expectedGlobalRule == null && actual != null)

SonarQube: 更改此条件,使其不会始终评估为"true".条件不应无条件地评估为"TRUE"或"FALSE"

我本质上是在做这个逻辑,以避免我的"块被执行"上的NPE.

我的代码

matches1()

private boolean matches1(GbRule actual, GbRule expected) {
     if(actual == null && expected == null) {
        return true;
     } else if((expected == null && actual != null) || (expected != null && actual == null)) {
        return false;
     } else {
       //Block to be executed
     }
}
Run Code Online (Sandbox Code Playgroud)

我颠倒了逻辑,看看SonarQube会告诉我什么,他并没有抱怨它. matches2()

private boolean matches2(GbRule actual, GbRule expected) {
      if(actual == null && expected == null) {
         return true;
      } else if(expected != null && actual != null)  {
         //Block to be executed
      } else {
         return false;
      }
}
Run Code Online (Sandbox Code Playgroud)

  1. 问题是在我的布尔逻辑中还是SonarQube失去了理智?
  2. 如果问题在sonarQube内,我该如何解决?

G. *_*eam 6

问题在于你的逻辑.让我们一块一块地把它拿走:

 if(actual == null && expected == null) {
    return true;
Run Code Online (Sandbox Code Playgroud)

此时,如果两个变量都是,null那么我们就不再使用该方法了.因此,如果我们得到任何进一步,那么其中至少有一个是非空的.

此时可行的选择是:

  • actual = null,expected =非null

  • actual =非null,expected = null

  • actual =非null,expected =非null

现在,让我们看看下一段代码:

 } else if((expected == null && actual != null) 
Run Code Online (Sandbox Code Playgroud)

我们已经知道这两个变量都不可能null,所以一旦我们知道expected == null,就没有必要测试是否actual != null.事实证明,我们已经做到了这一点.所以actual != null总是如此,这就是提出问题的原因.

编辑

这意味着您的代码可以归结为:

private boolean matches1(GbRule actual, GbRule expected) {
  if(actual == null && expected == null) {
    return true;
  } else if(actual == null || expected == null) {
    return false;
  } 

  //Block to be executed
}
Run Code Online (Sandbox Code Playgroud)

请注意,else不需要它并删除它使代码更容易阅读.

  • 是的,在您的原始代码中`&& actual!= null`是多余的 (2认同)