当我按预期运行下面的代码片段时,我得到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)
我原以为它会为第二个例子返回一个Optional.empty。任何人都可以解释我为什么会这样做。
答案 0 :(得分:0)
首先,让我们回顾一下ofNullable
的用法。
ofNullable
返回描述指定值if的Optional 非null,否则返回一个空的Optional。
Optional<T>
类型旨在作为类型T
的引用的更安全的替代方法,该引用既可以引用对象,也可以为null,并且您违反此规则
当您执行1 / doubleNull
作为ofNullable
方法的参数时,您基本上将doubleNull
拆箱到原始double
类型,该类型会抛出异常,因此根本没有调用ofNullable
。
答案 1 :(得分:0)
如果您希望获得Optional.empty
,也许您想要的是在您的可空座位上拨打map
:
Double dbNull = null;
Optional nullableOptional = Optional.ofNullable( dbNull );
Optional inverseOptional = nullableOptional.map(x -> 1/x);
此处inverseOptional
将为empty
。另一方面,如果nullableOptional
持有某个值,那么inverseOptional
将保持相反的值。
使用组合方法map
是安全保护自己免受NullPointerException
答案 2 :(得分:0)
由于Optional#ofNullable
引发null.doubleValue()
,因此在第二种情况下,NullPointerException
语句永远不会运行。当对包装器类型Double
进行一些数学运算时,编译器会将包装器类型自动解包为原始类型double
。
// your code is same as below but it done by compiler ---v
Optional nullableOptional1 = Optional.ofNullable( 1/doubleNull.doubleValue());
您可以使用Optional#map来实现自己的方式,例如:
Optional nullableOptional1 = Optional.ofNullable(doubleNull).map(it->1/it);
// |
// |
// Notes: if the value is absent, the provided mapping function is never called