java - 即使使用 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;
}
欢迎任何提示或帮助:)
解决方案
// 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
value 初始化,而是使用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;
}
推荐阅读
- apache-zookeeper - 无法启动 zookeeper
- unit-testing - 如何模拟 CriteriaQuery.where(EntityRoot.get(ID).in(List
) - html - HTML 在不使用 javascript 的情况下检测浏览器窗口宽度的变化
- android - 在 buildozer 上构建 apk 时出错
- powershell - 我目前正在尝试制作一个从路径文件打开某个文件的 Powershell 脚本。但是,我真的不知道该放什么
- pointers - 反射结构字段。使用标志指针值设置
- python - 通过抓取网站获取 gps 位置 | Python
- c - 如何在C中打印一个向量
- docusignapi - 带有 javaee-api 8.0 的 DocuSign REST API java sdk 抛出 java.lang.ClassNotFoundException: org.glassfish.jersey.internal.RuntimeDelegateImpl
- reactjs - React nobelprizes API:如何打印一年的所有获奖者?