Java 即使使用可选选项,仍会获取NullPointerException
我试图使用Optional来检查nullpointexception,万一它发生了,就打印其他东西。 我正在将声卡设置为null,但仍然得到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<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;
}