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){...}
答案 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 != null
。 equals()
调用可以做到这一点。
} else if(first == null ^ second == null){
在这种情况下,您应该返回false
,假设这本身就是equals()
方法。
如果FindBugs不喜欢这个改变我会忽略它,它不知道它在说什么。这不完美。加入例外规则。