2017-05-31 38 views
-2

當我按預期運行下面的代碼片段,我得到Optional.empty差異8

//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。任何人都可以解釋我爲什麼這樣表現。

+1

有**什麼**做選配:https://docs.oracle.com/javase/tutorial/ java/data/autoboxing.html – luk2302

+1

除此之外:通過省略參數來使用原始類型。永遠不要這樣做。首先關注基礎知識。並且支付異常消息的更多細節。他們會告訴你真正發生問題的地方。 – GhostCat

回答

0

首先讓我們回顧一下ofNullable的用法。

ofNullable返回一個可選描述指定的值,如果 非空,否則返回一個空可選。

Optional<T>類型旨在爲T,要麼是指一個對象或爲空類型的引用更安全的替代,而你打破這個規則。

當您執行1/doubleNull作爲參數傳遞給ofNullable方法,你基本上拆箱的doubleNull到原始double類型會拋出異常,因此ofNullable不會被調用的。

0

如果你希望得到一個Optional.empty,也許你想要的是調用map您可空:

Double dbNull = null; 
Optional nullableOptional = Optional.ofNullable(dbNull); 
Optional inverseOptional = nullableOptional.map(x -> 1/x); 

這裏inverseOptionalempty。另一方面,如果nullableOptional持有一些價值,那麼inverseOptional將持有它的倒數。

使用組合子方法map是安全地保護自己免受NullPointerException

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