为什么IntelliJ告诉我我的班从不返回null?

时间:2019-04-20 16:58:30

标签: java intellij-idea

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语句始终为真。它怎么知道呢?这是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()结果,而只是进行空检查,检查消息就会消失。

我正在使用Java 8。

2 个答案:

答案 0 :(得分:6)

Optional类具有两种方法:

  • Optional.of->如果参数为null
  • ,则会引发异常
  • Optional.ofNullable->如果参数为null
  • ,则创建一个空的可选内容

因此,如果您的方法返回null,则of()方法将引发异常,而空的optional将永远不会到达您的if语句

答案 1 :(得分:2)

Optional.of(verse.getCompounds());返回包含有效值的Optional

后面的isPresent检查将始终为真,因为Optional compounds永远不会没有值,因为您只需在上面的行中将其设置为有效值即可。