Почему IntelliJ говорит мне, что мой класс никогда не возвращает null?

private void addCompoundsFrom(Verse verse) {
    Optional<List<Compound>> compounds = Optional.of(verse.getCompounds());
    if (compounds.isPresent()) {
        for (Compound compound : compounds.get()) {
            addCompoundsFrom(compound);
        }
    }
}

Инспектор IntelliJ говорит мне, что оператор if всегда верен. Откуда оно может это знать? Это класс соединений:

public class Compounds extends PositionalIds {

    @XmlElement(name = "verse")
    private List<Verse> verses;

    public List<Verse> getVerses() {
        return verses;
    }
}


@XmlTransient
public abstract class PositionalIds {

    @XmlAttribute(name = "start")
    private String startId;

    @XmlAttribute(name = "end")
    private String endId;

    public String getStartId() {
        return startId;
    }

    public String getEndId() {
        return endId;
    }
}

И класс Verse:

public class Verse extends PositionalIds {

    @XmlElement(name = "compound")
    private List<Compound> compounds;

    @XmlAttribute(name = "notation")
    private String notation;

    public List<Compound> getCompounds() {
        return compounds;
    }

    public String getNotation() {
        return notation;
    }
}

Если я перестану использовать Optional для переноса результата verse.getCompounds() и вместо этого просто проверю значение null, сообщение о проверке исчезнет.

Я использую Java 8.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
40
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Optional.of(verse.getCompounds()); возвращает Optional, который содержит допустимое значение.

Следующая проверка isPresent всегда будет истинной, потому что Optionalcompounds никогда не будет иметь значение, так как вы только что установили его в допустимое значение в строке выше.

Ах, я думаю, что я хотел использовать ofNullable вместо of

Sahand 20.04.2019 19:05

@Sahand Да, это имело бы больше смысла.

Carcigenicate 20.04.2019 19:06
Ответ принят как подходящий

Класс Optional имеет два метода:

  • Optional.of -> выдает исключение, если параметр равен null
  • Optional.ofNullable -> создает пустой необязательный параметр, если параметр равен null

Следовательно, если ваш метод возвращает null, метод of() выдаст исключение, а пустое опциональное никогда не достигнет вашего оператора if.

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