为什么FindBugs会显示冗余空值检查的警告

时间:2013-10-15 20:59:47

标签: java findbugs

if (first != null && second != null && !first.equals(second)) {
  // not null & not equal
} else if (first == null ^ second == null) {
  // not both null and not both not null
  // (first == null && second != null) || (first != null && second == null)
} else {
  // both null or equal
}

FindBugs抱怨其他if(first == null ^ second == null){...}

5 个答案:

答案 0 :(得分:0)

可能是因为它只是软件。

答案 1 :(得分:0)

由于您在评论中写道:not both null因为您应该使用&&(AND)而不是^(XOR),所以FindBugs向您显示您的(潜在)错误是件好事。 :

first != null && second != null

或者:

!(first == null || second == null)

<强>更新
OP将注释更改为:“not both both null not not both not null”此条件需要不同的if

(first == null && second != null) || (first != null && second == null)

相当于:

first == null ^ second == null

只是前一版本更具可读性。

答案 2 :(得分:0)

^运算符是一个按位运算符,而不是逻辑运算符。虽然技术上正确,但是如果逻辑表达式增长,运算符的优先级会使表达式混乱。我不使用FindBugs,但我会将第3行称为嫌疑人 - 将其包裹在括号中或重写它。

 ...
 } else if ((first == null) ^ (second == null)) {
 ...
只要操作数是布尔值,

^就像逻辑操作一样。由于每个逻辑和按位运算符的优先级不同,因此您应始终使用括号分组,因为评估顺序不会从左到右,而是基于此处的表:http://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html

你的表达“not both null”和“not not not null”如下所示:

(first == null) || second == null) && !((first == null && second == null))

这很令人困惑,但这正是你所要求的。

我不确定你在块中做了什么,但是像这样编写整个块可能更容易:

if(first!=null && !first.equals(second)) {
  // first is not null and the first and second are not equal
} else if (second!=null && !second.equals(first)) {
  // second is not null and first and second are not equal
} else {
  // all that is left is that first and second are both null OR neither one is null but they are equal
}

答案 3 :(得分:0)

警告说:冗余空检查。因此,FindBugs认为您正在冗余地检查变量的无效性。尝试此代码也会触发警告:

    Boolean firstNull = (first == null);
    Boolean secondNull = (second == null);
    Boolean equalFirstSecond = first.equals(second);

    if (!firstNull && !secondNull && !equalFirstSecond) {
        // not null & not equal
    } else if (firstNull ^ secondNull){
        // not both null and not both not null
    } else {
        // both null or equal
    }

答案 4 :(得分:-2)

  

if(first!= null&amp;&amp; second!= null&amp;&amp;!first.equals(second)){

您无需在此处测试second != nullequals()调用可以做到这一点。

  

} else if(first == null ^ second == null){

在这种情况下,您应该返回false,假设这本身就是equals()方法。

如果FindBugs不喜欢这个改变我会忽略它,它不知道它在说什么。这不完美。加入例外规则。