仍然得到NullPointerException异常,即使使用可选的<>

问题描述 投票:-5回答:3

我想使用可选的<>保持对nullpointexception的检查,柜面然后就发生了一些otherthing打印。 (https://www.oracle.com/technetwork/articles/java/java8-optional-2175753.html

我设置声卡为null,还是我得到NullPointerException异常,但我想与功能,避免它。

主类(计算机)

import java.util.Optional;

public class Computer {
    public Optional<SoundCard> getSoundcard() {
        return soundcard;
    }

    public void setSoundcard(Optional<SoundCard> soundcard) {
        this.soundcard = soundcard;
    }

    private Optional<SoundCard> soundcard = null ;


    public static void  main(String[] args)
    {
         Optional<Computer> computer = Optional.of(new Computer());;


        String verion = computer.flatMap(Computer::getSoundcard)
            .flatMap(SoundCard::getUsb)
            .map(USB::getVersion)
            .orElse("Unknown");
        System.out.println(verion);
    }
}

另一类声卡

import java.util.Optional;

public class SoundCard {

    public Optional<USB> getUsb() {
        return usb;
    }

    public void setUsb(Optional<USB> usb) {
        this.usb = usb;
    }

    private Optional<USB> usb = null;
}

另一类(USB)

public class USB {

    public String getVersion() {
        return version;
    }

    public void setVersion(String version) {
        this.version = version;
    }

    private String version;
}

任何提示或帮助是值得欢迎:)

java java-8 optional
3个回答
2
投票
// computer initialization
Optional<Computer> computer = Optional.of(new Computer());

// Applying operations to Optional<Computer>: stream() is for Collections, not for Optionals
String version = computer.flatMap(Computer::getSoundcard)
            .flatMap(SoundCard::getUsb)
            .map(USB::getVersion)
            .orElse("Unknown");

更新

此外,像Computer.soundcard(具有类型Optional)字段不应该与null值,但使用Optional.empty()初始化,以避免NullPointerException或类似的错误...

因此,完整的代码

public class Computer {
    public Optional<SoundCard> getSoundcard() {
        return soundcard;
    }

    public void setSoundcard(Optional<SoundCard> soundcard) {
        this.soundcard = soundcard;
    }

    private Optional<SoundCard> soundcard = Optional.empty() ;


    public static void  main(String[] args)
    {
        Optional<Computer> computer = Optional.of(new Computer());

        String version = computer
                .flatMap(Computer::getSoundcard)
                .flatMap(SoundCard::getUsb)
                .map(USB::getVersion)
                .orElse("Unknown");
        System.out.println(version);
    }
}

class SoundCard {

    public Optional<USB> getUsb() {
        return usb;
    }

    public void setUsb(Optional<USB> usb) {
        this.usb = usb;
    }

    private Optional<USB> usb = Optional.empty();
}

class USB {

    public String getVersion() {
        return version;
    }

    public void setVersion(String version) {
        this.version = version;
    }

    private String version;
}

0
投票

你应该初始化变量电脑:

Optional<Computer> computer = Optional.of(new Computer());

你做的方式,computer是真的不初始化。


0
投票

假设你使用的是Java 8,这里的Optional类的javadoc,这是这样说的:

的容器对象,其可以或可以不包含一个非空值。如果值存在,isPresent()将返回true和get()将返回值。

现在,stream()的东西,对对象的集合,而不是单个对象的作品。 Here'sstream()的文档:

返回与此集合作为其源的连续流。基本上,你需要有一个List<Computer>为了调用stream(),执行过滤和Optional<Computer>方法(S)返回find

当你试图调用stream()单个对象,而不是一个集合,它显示了一个错误。

此外,呼吁在Java中的非实例变量的任何方法将总是产生编译错误,例如:

Optional<Computer> computer ;
computer.stream(); // compilation error

所以,我们首先需要初始化,并确保我们呼吁基于引用的类型的正确方法。

© www.soinside.com 2019 - 2024. All rights reserved.