2015-05-04 4 views
10

FindBugs beschwert sich über Mögliche Nullzeigerdereferenzierung von str1 auf Zweig, der in Comparator.compareStrings (String, String) in diesem Verfahren nicht durchführbar sein könnte:Wie kann eine Variable in diesem Codeabschnitt null sein?

private static int compareStrings(final String str1, final String str2) { 
    if ((str1 == null) && (str2 == null)) { 
     return COMPARE_ABSENT; 
    } 
    if ((str1 == null) && (str2 != null)) { 
     return COMPARE_DIFFERS; 
    } 
    if ((str1 != null) && (str2 == null)) { 
     return COMPARE_DIFFERS; 
    } 
    return str1.equals(str2) ? COMPARE_EQUALS : COMPARE_DIFFERS; 
} 

in Eclipse, habe ich auch eine Warnung auf dem letzten sehen Zeile (str1 kann null sein).

Unter welchen Umständen kann str1 sein null in return str1.equals(str2) ? COMPARE_EQUALS : COMPARE_DIFFERS; (vorausgesetzt, dass die ersten beiden, wenn Blöcke, um die Situationen abdecken, wenn str1 null ist)?

+7

Es kann nicht, aber Eclipse ist nicht intelligent genug zu erzählen. – immibis

+0

(Persönlich bevorzuge ich es, diese Warnung zu deaktivieren. Es führt zu übermäßig defensiven Code) – immibis

+5

(Warum auch nicht einfach 'Objects.equals' verwenden?) – immibis

Antwort

9

können Sie die Warnung vermeiden, indem Sie die if-Anweisungen neu anordnen:

private static int compareStrings(final String str1, final String str2) { 
    if (str1 == null) { 
     if (str2 == null)) { 
      return COMPARE_ABSENT; 
     } else { 
      return COMPARE_DIFFERS; 
     } 
    } else { 
     if (str2 == null)) { 
      return COMPARE_DIFFERS; 
     } else { 
      return str1.equals(str2) ? COMPARE_EQUALS : COMPARE_DIFFERS; 
     } 
    } 
} 
+0

zurück str1 == null? (str2 == null? COMPARE_ABSENT: COMPARE_DIFFERS): (str1.equals (str2)? COMPARE_EQUALS: COMPARE_DIFFERS); // eine kurze Antwort –

+2

@ Harry.Chen Aber ist es lesbarer? Ich denke, das ist eine Frage der Meinung :) – Eran

+0

Für lesenswert, stimme ich zu! :) –

2

An dem Punkt, wo Sie str1.equals(str2) nennen, str1nichtnull sein. Sie sollten diese Warnung an dieser Stelle unterdrücken.