首页 > 解决方案 > 即使使用 Optional<> 仍然会出现 NullPointerException

问题描述

我正在尝试使用 Optional<> 来检查 nullpointexception 并以防它发生然后打印其他内容。(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;
}

欢迎任何提示或帮助:)

标签: javajava-8optional

解决方案


// 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)之类的字段不应使用nullvalue 初始化,而是使用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;
}

推荐阅读