Как переменная может быть нулевой в этом фрагменте кода?
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
нулевой)?
2 ответа
Решение
Вы можете избежать предупреждения, переставив операторы 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;
}
}
}
В тот момент, когда вы звоните str1.equals(str2)
, str1
не может быть null
, Вы должны подавить это предупреждение в этом месте.