Как переменная может быть нулевой в этом фрагменте кода?
FindBugs жалуется на возможное разыменование нулевого указателя str1 на ветке, которое может быть недопустимо в Comparator.compareStrings(String, String) в этом методе:
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
может быть нулевым).
В каких обстоятельствах может str1
быть null
в return str1.equals(str2) ? COMPARE_EQUALS : COMPARE_DIFFERS;
(учитывая, что первые два блока if охватывают ситуации, когда str1
равно null)?
Ответы
Ответ 1
Вы можете избежать предупреждения, изменив инструкции 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;
}
}
}
Ответ 2
В тот момент, когда вы вызываете str1.equals(str2)
, str1
не может быть null
. Вы должны подавить это предупреждение в этом месте.