2015-05-04 37 views
10

FindBugs的抱怨str1中的分支有關可能的空指針引用,可能是在Comparator.compareStrings不可行(字符串,字符串)這個方法:在這段代碼中,變量如何能爲空?

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; 
} 

在Eclipse中,我也看到了最後的警告行(str1可能爲空)。

在什麼情況下str1nullreturn str1.equals(str2) ? COMPARE_EQUALS : COMPARE_DIFFERS;(假設前兩個if塊覆蓋情況,str1爲空時)?

+7

這不可能,但是Eclipse是沒有足夠的智慧告訴。 – immibis

+0

(就個人而言,我更願意禁用警告這會導致過度防禦性代碼。) – immibis

+5

(另外,爲什麼不使用'Objects.equals'?) – immibis

回答

9

您可以通過重新排列if語句避免該警告:

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

return str1 == null? (?STR2 == NULL COMPARE_ABSENT:COMPARE_DIFFERS):(str1.equals(STR2)COMPARE_EQUALS:COMPARE_DIFFERS); //一個更簡單的答案 –

+2

@ Harry.Chen但它是更具可讀性?我想這是一個意見的問題:) – Eran

+0

爲了可讀,我同意! :) –

2

在您撥打str1.equals(str2)的地方,str1不能null。您應該在該位置抑制此警告。

相關問題