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

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

Другие вопросы по тегам