7
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 は、else if (first == null ^ second == null) {...} について不平を言っています。

4

5 に答える 5

0

あなたがコメントに書いたので: (XOR)ではなく (AND)not both nullを使うべきだったので、FindBugs があなたの (潜在的な) 間違いを示したのは良いことです:&&^

first != null && second != null

または代わりに:

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

更新:
OP はコメントを次のように変更します:「両方とも null ではなく、両方とも null でもない」この条件には別の条件が必要ifです:

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

これは次と同等です:

first == null ^ second == null

以前のバージョンの方が読みやすいというだけです。

于 2013-10-15T21:06:05.267 に答える
0

警告には次のように書かれています:冗長な null チェック。したがって、FindBugs は、変数の null 性を冗長にチェックしていると考えます。このコードでも警告がトリガーされるかどうかを試してください。

    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
    }
于 2014-05-05T08:28:46.050 に答える
-2

if (最初 != null && 2番目 != null && !first.equals(second)) {

ここでテストする必要はありませんsecond != nullequals()呼び出しはそれを行います。

} それ以外の場合 (最初 == null ^ 2 番目 == null) {

falseこの場合、これがequals()メソッド自体であると仮定して、戻る必要があります。

FindBugs がこの変更を気に入らない場合は、無視します。何について話しているのかわかりません。完璧ではありません。例外規則を入れます。

于 2013-10-16T07:22:18.620 に答える