Почему Android Studio выдает предупреждение об исключении нулевого указателя с этим кодом? - PullRequest
0 голосов
/ 09 июня 2019

У меня есть следующий код в Android Studio, но я получаю предупреждение, что Method invocation 'toString()' may produce 'NullPointerException'.

String source_regions_user_id = "";
if (user_ids != null && "".equals(source_region) && user_ids.containsKey(source_region) && user_ids.get(source_region) != null && user_ids.get(source_region) != "") {
    source_regions_user_id = user_ids.get(source_region).toString();
} else {
    return true; // Unable to find a matching user_id for source_region
}

Обратите внимание, что user_ids - это Hashmap, а source_region - это String.

Я полагаю, что проверяю нулевые значения во всем, на что toString() опирается, так почему Android Studio по-прежнему выдает это предупреждение?

1 Ответ

1 голос
/ 09 июня 2019

Компилятор должен был видеть, что вы проверяете на null, но - это много условий в операторе if, поэтому, возможно, он превысил некоторый порог для производительности компилятора.

Поскольку else - это не что иное, как return, вы должны перевернуть утверждение.Это избавляет от необходимости объявлять переменную отдельно.

Я также разделил условия, чтобы прокомментировать их.

if (user_ids == null)
    return true;
if (! "".equals(source_region)) // I think you meant the opposite check
    return true;
if (! user_ids.containsKey(source_region)) // Redundant, the next check will cover this
    return true;
if (user_ids.get(source_region) == null)
    return true;
if (user_ids.get(source_region) == "") // Object is not a string, so this will always fail
    return true;
String source_regions_user_id = user_ids.get(source_region).toString();

Вы также должны использовать isEmpty() или length() дляпроверять наличие пустых строк вместо сравнения с "".

Итак, принимая во внимание эти комментарии, мы можем изменить код на:

if (user_ids == null || source_region.isEmpty())
    return true;
Object obj = user_ids.get(source_region);
if (obj == null)
    return true;
String source_regions_user_id = obj.toString();
if (source_regions_user_id.isEmpty())
    return true;
// use value here

С этим кодом компилятор не должен 'не запутайтесь, так что без предупреждения, и вы только посмотрите на карту один раз.

...