Java - Intellij IDEA предупреждает о NPE в методе получения перечисления lambda - PullRequest
1 голос
/ 18 июня 2019

У меня есть следующее перечисление:

import com.google.common.collect.Maps;

public enum ServiceType {
    SOME_SERVICE (4, SomeServiceEntity.class);

    private int id;
    private Class<? extends ServiceEntity> entityClass;

    private static final Map<Integer, ServiceType> LOOKUP = Maps.uniqueIndex(
            Arrays.asList(ServiceType.values()),
            ServiceType::getId     <<=======
    );

    ServiceType(int id, Class<? extends ServiceEntity> entityClass) {
        this.id = id;
        this.entityClass = entityClass;
    }

    public int getId() {
        return id;
    }

    // and other methods....
}

Эта строка кода, помеченная Intellij IDEA как:

Вызов ссылки на метод 'ServiceType :: getId' может привести к появлению 'java.lang.NullPointerException '

Как это возможно, пока у меня есть единственный конструктор, который включает мое поле id, а enum - это статический список объектов, поэтому все они предполагают, что у них есть идентификатор?

Как мне избавиться от этого предупреждения?

UPD: наклеено:

private static final Map<Integer, ServiceType> LOOKUP = Arrays.stream(
        ServiceType.values()).collect(Collectors.toMap(
                ServiceType::getId, Function.identity()
        )
);

1 Ответ

3 голосов
/ 18 июня 2019

Как говорится в комментарии, вы используете лямбду, которая получает параметр.И когда этот ноль, это дает NPE.

Так что попробуйте что-то вроде:

private static final Map<Integer, ServiceType> LOOKUP = 
  Arrays
    .stream(ServiceType.values())
    .Collectors.toMap(ServiceType::getId, Function. identity());

, которое ... ошибаться ... может дать вам то же самое предупреждение.

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

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