Как переменная может быть нулевой в этом фрагменте кода?

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. Вы должны подавить это предупреждение в этом месте.