Java8中可选类的可调用方法输出的差异

Java8中可选类的可调用方法输出的差异,java,java-8,Java,Java 8,当我按预期运行下面的代码段时,我得到Optional.empty //Example 1 Double dbNull = null; Optional nullableOptional = Optional.ofNullable( dbNull ); System.out.println(nullableOptional); 但是当我运行下面的代码片段时 //Example 2 Double doubleNull = null; Optio

当我按预期运行下面的代码段时,我得到Optional.empty

   //Example 1
    Double dbNull = null;
    Optional nullableOptional = Optional.ofNullable( dbNull );
    System.out.println(nullableOptional);
但是当我运行下面的代码片段时

    //Example 2
    Double doubleNull = null;
    Optional nullableOptional1 = Optional.ofNullable( 1/doubleNull );
    System.out.println(nullableOptional1);
我明白了

Exception in thread "main" java.lang.NullPointerException
at com.main.java8.streams.CreatingOptionalValuesDemo.main(CreatingOptionalValuesDemo.java:30)

我希望第二个示例也会返回可选的.empty。谁能解释一下它为什么会这样做。

首先,让我们回顾一下的用法

如果需要,返回描述指定值的可选值 非null,否则返回空的可选值

类型是指引用对象或为空的
T
类型引用的更安全的替代方法,您正在违反此规则


当您将
1/doubleNull
作为方法的参数执行时,实际上是将
doubleNull
解封为一个基本
double
类型,该类型会引发异常,因此根本不会调用

如果您希望得到一个
可选的.empty
,那么您可能需要在您的可空文件上调用
map

Double dbNull = null;
Optional nullableOptional = Optional.ofNullable( dbNull );
Optional inverseOptional = nullableOptional.map(x -> 1/x);
这里的
inverseOptional
为空
。另一方面,如果
nullableOptional
持有某个值,那么
inverseOptional
将持有该值的倒数


使用combinator方法
map
是安全保护自己免受
NullPointerException

在第二种情况下,由于
null.doubleValue()
引发
NullPointerException
,因此在第二种情况下根本不会运行
Optional>语句。当对包装器类型
Double
执行一些数学运算时,编译器将自动将包装器类型取消装箱为原始类型
Double

//      your code is same as below but it done by compiler ---v
Optional nullableOptional1 = Optional.ofNullable( 1/doubleNull.doubleValue());
您可以使用来实现您的目标,例如:

Optional nullableOptional1 = Optional.ofNullable(doubleNull).map(it->1/it);
//                                                                 |
//                                                                 |
// Notes: if the value is absent, the provided mapping function is never called

与optionals无关:除此之外:您通过省略参数使用原始类型。永远不要那样做。首先关注基础知识。并支付有关异常消息的更多详细信息。他们会告诉你问题到底发生在哪里。