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)
问题在于你的逻辑.让我们一块一块地把它拿走:
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不需要它并删除它使代码更容易阅读.