Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 即使使用可选选项,仍会获取NullPointerException_Java_Java 8_Optional - Fatal编程技术网

Java 即使使用可选选项,仍会获取NullPointerException

Java 即使使用可选选项,仍会获取NullPointerException,java,java-8,optional,Java,Java 8,Optional,我试图使用Optional来检查nullpointexception,万一它发生了,就打印其他东西。 我正在将声卡设置为null,但仍然得到nullpointerexception,但我希望使用可选选项来避免它 主级计算机 欢迎任何提示或帮助:您应该初始化计算机变量: Optional<Computer> computer = Optional.of(new Computer()); 按照您的方式,计算机实际上没有初始化。假设您使用的是Java 8,下面是可选类的javadoc,

我试图使用Optional来检查nullpointexception,万一它发生了,就打印其他东西。

我正在将声卡设置为null,但仍然得到nullpointerexception,但我希望使用可选选项来避免它

主级计算机


欢迎任何提示或帮助:

您应该初始化计算机变量:

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

按照您的方式,计算机实际上没有初始化。

假设您使用的是Java 8,下面是可选类的javadoc,它是这样说的:

可以包含或不包含非空值的容器对象。如果 值存在,isPresent将返回true,get将返回 价值

现在,流是一种作用于对象集合而不是单个对象的东西。流的文档:

返回以此集合作为其源的序列流。基本上,您需要有一个列表,以便调用流、执行筛选并通过find方法返回可选的结果

当您试图在单个对象而不是集合上调用流时,它会显示一个错误

此外,在java中对非实例化变量调用任何方法都会产生编译错误,例如:

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

因此,我们需要首先初始化它,并确保根据引用类型调用正确的方法。

只需初始化变量可选计算机;这是因为它没有初始化。=>可选计算机;计算机1=新计算机;字符串verion=computer.Stream.flatMapComputer::getSoundcard也是Stream,而不是StreamVariable计算机未初始化。这意味着您必须创建计算机的可选项或创建空的可选项。例如,可选计算机=Optional.ofnew computer或可选计算机=Optional.empty。我不确定Optionals是否有方法流,但如果是真的,它必须以小写字母开头。实际上,他是在一个非实例化变量上调用stream,这是第一个和第二个问题。注意,可选,因为Java-9也有流。@Stultuske nullpointer感谢您的输入,我已经更新了答案。事实上,我会删除我的答案。但当我将声卡设置为null时,它会抛出nullpointerexception,但我使用optional to不看到null pointerexception,请帮助。@Raam从未将optional设置为null。我认为问题出在计算机和声卡的课堂上:如果一台类似于fielf的计算机。声卡'是可选的,它不应该被定值为null,而是可选的。空的。我更新了我的响应,包括所有类…@Raam好吧,Optional只是一个类,就像其他任何类一样,所以你当然可以给它赋值null,它将被编译。但是可选类背后的想法是避免必须分配null,这是导致NullPointerException的首要原因。因此,它提供了自己的空方法,您应该在需要表示缺少的值时使用它。
// 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");
Optional<Computer> computer = Optional.of(new Computer());
Optional<Computer> computer ;
computer.stream(); // compilation error
// 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");
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;
}