2015-05-04 33 views
10

FindBugs phàn nàn về có thể trỏ dereference null str1 trên chi nhánh đó có thể là không khả thi trong Comparator.compareStrings (String, String) trong phương pháp này:Làm thế nào một biến có thể là null trong đoạn mã này?

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

Trong Eclipse, tôi cũng thấy một cảnh báo trên cuối cùng dòng (str1 có thể rỗng).

Trong những trường hợp nào có thể str1null trong return str1.equals(str2) ? COMPARE_EQUALS : COMPARE_DIFFERS; (nếu hai khối đầu tiên bao gồm các trường hợp, khi str1 là null)?

+7

Nó không thể, nhưng Eclipse là không đủ thông minh để nói. – immibis

+0

(Cá nhân, tôi muốn vô hiệu cảnh báo đó. Mã này dẫn đến mã phòng thủ quá mức) – immibis

+5

(Ngoài ra, tại sao không sử dụng 'Objects.equals'?) – immibis

Trả lời

9

Bạn có thể tránh các cảnh báo bằng việc sắp xếp lại nếu phát biểu:

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); // một câu trả lời ngắn hơn –

+2

@ Harry.Chen Nhưng nó có dễ đọc hơn không? Tôi đoán đó là vấn đề quan điểm :) – Eran

+0

Để đọc được, tôi đồng ý! :) –

2

Tại thời điểm bạn gọi str1.equals(str2), str1không thểnull. Bạn nên chặn cảnh báo này tại vị trí đó.

Các vấn đề liên quan