Почему Map.getOrDefault () предупреждает об исключении NullPointerException? - PullRequest
1 голос
/ 15 апреля 2019

У меня есть карта (своего рода мультикарта) со следующей подписью:

Map<String, Set<String>> motherChildIndex;

Если ключ не существует на карте, я бы предпочел, чтобы он возвращал пустой набор(в отличие от нуля), поэтому я наткнулся на метод getOrDefault, который должен позволить мне эффективно "игнорировать" пустые значения.

Вот мой соответствующий код:

motherChildIndex
        .getOrDefault(personId, Collections.emptySet()) //personId is just a string that may or may not be in the map, hence getOrDefault
        .stream() //I get the warning here
        .map(personsIndex::get) //Not important to reproduce
        .forEach(children::add); //Not important to reproduce

В строке .stream() я получаю предупреждение:

При вызове метода 'stream' может возникнуть 'java.lang.NullPointerException'

Почему?Я думал, что getOrDefault() должен был никогда не возвращать ноль.

Я использую Android Studio в качестве своей IDE, если это что-то меняет.

1 Ответ

0 голосов
/ 15 апреля 2019

Похоже, что getOrDefault () имеет аннотацию RecentNullable в Map.class, которая выглядит как аннотация Nullable (и это полностью мое взаимодействие, только вопрос по этому вопросу, если вы хотите прочитать: что такое @Недавно не полная аннотация? ).

Следовательно, я предполагаю, что IntelliJ читает его и сразу же предупреждает вас о возможности возврата нулевого значения, поэтому считает, что stream () может вызвать исключение NullPointerException (поскольку для IntelliJ карта может быть нулевой), а затем предлагает вамиметь ненулевую проверку на карте.

Странно то, что (как и в вопросе stackoverflow) аннотация, по-видимому, отсутствует в документации Java.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...