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

#java #intellij-idea

#java #intellij-идея

Вопрос:

 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 всегда имеет значение true. Как он может это знать? Это класс Compounds:

 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.

Ответ №1:

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

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

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

Ответ №2:

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

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

Комментарии:

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

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