Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.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 可选。不可用的orElse抛出NPE_Java_Java 8_Null_Optional - Fatal编程技术网

Java 可选。不可用的orElse抛出NPE

Java 可选。不可用的orElse抛出NPE,java,java-8,null,optional,Java,Java 8,Null,Optional,我一直在使用此代码: Event rEvent = new Event(); Map<Long, Message> msgMap = getMsg(); Message msg = msgMap.get(rEvent.getMsgId()); Long id = Optional.ofNullable(rEvent.getPkId()).orElse(msg.getPkId()); 假设rEvent.getPkId和msg都为null。 因此,将跳过可选的.ofNullable

我一直在使用此代码:

Event rEvent = new Event();

Map<Long, Message> msgMap = getMsg();
Message msg = msgMap.get(rEvent.getMsgId());

Long id = Optional.ofNullable(rEvent.getPkId()).orElse(msg.getPkId());
假设rEvent.getPkId和msg都为null。 因此,将跳过可选的.ofNullablerEvent.getPkId,然后执行orElse。这里它抛出了NPE。
如何使用Optional.ofNullable对多个空检查重新编码?

在您的情况下,我只需使用一个简单的if-else:

Long id = null; // default value
if(rEvent.getPkId() != null) {
   id = rEvent.getPkId();
} else if(msg != null){
   id = msg.getPkId();
}
但如果您想练习可选,在这种情况下,您需要另一个可选的msg:


在您的情况下,我只需使用一个简单的if-else:

Long id = null; // default value
if(rEvent.getPkId() != null) {
   id = rEvent.getPkId();
} else if(msg != null){
   id = msg.getPkId();
}
但如果您想练习可选,在这种情况下,您需要另一个可选的msg:

假设rEvent.getPkId为null,msg也为null。所以 将跳过可选的.ofNullablerEvent.getPkId,然后删除orElse 执行。这里它抛出空指针异常。如何重新编码 是否对多个空检查使用可选的.ofNullable

如果消息为空,则需要事先检查。考虑以下方法:

public static Long ofNullable(Long ...options){
   return Arrays.stream(options).filter(Objects::nonNull).findFirst().orElseThrow();
}
在你的情况下:

Long messageID = (msg != null) ? msg.getPkId() : null;
Long id = ofNullable(rEvent.getPkId(), option2, .. option N -1, messageID);
我们首先检查msg是否为null,如果它仍然在nullable方法中使用,因为其他选项可能不为null,因此可以使用它

运行示例:

输出:

假设rEvent.getPkId为null,msg也为null。所以 将跳过可选的.ofNullablerEvent.getPkId,然后删除orElse 执行。这里它抛出空指针异常。如何重新编码 是否对多个空检查使用可选的.ofNullable

如果消息为空,则需要事先检查。考虑以下方法:

public static Long ofNullable(Long ...options){
   return Arrays.stream(options).filter(Objects::nonNull).findFirst().orElseThrow();
}
在你的情况下:

Long messageID = (msg != null) ? msg.getPkId() : null;
Long id = ofNullable(rEvent.getPkId(), option2, .. option N -1, messageID);
我们首先检查msg是否为null,如果它仍然在nullable方法中使用,因为其他选项可能不为null,因此可以使用它

运行示例:

输出: