2017-05-31 16 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) 

私は、2番目の例でもOptional.emptyを返すと予想していました。それがなぜこのように振る舞うのか誰にでも説明できますか?

+1

は** optionalsとは何の関係も**を持っていません:https://docs.oracle.com/javase/tutorial/ java/data/autoboxing.html – luk2302

+1

それ以外では、パラメータを省略して生の型を使用しています。絶対にしないでください。まず基本に焦点を当ててください。例外メッセージの詳細については、お問い合わせください。彼らは問題が本当にどこに起こったのかを教えてくれました。 – GhostCat

答えて

0

まず、ofNullableの使用を要約しましょう。

ofNullable がnullでない場合は、指定した値を説明するオプションを返します。それ以外の場合は空を返します。オプション。

Optional<T>タイプは、オブジェクトを参照するか、nullでどちらかというタイプTの参照のための安全な代替として意図され、そしてあなたは、このルールを破っています。あなたはofNullableメソッドの引数として1/doubleNullを実行すると

、あなたは基本的に例外をスローするため、ofNullableが全く呼び出されていないプリミティブdouble型にdoubleNullをアンボクシングしています。

0

あなたがOptional.emptyを得るために期待している場合は、多分あなたが欲しいのは、あなたのNULL可能でmapを呼び出すことです。ここでは

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

inverseOptionalemptyになります。一方、nullableOptionalがある値を保持していた場合、inverseOptionalはその逆を保持します。コンビネータ方法mapを使用して

は声明Optional#ofNullable安全NullPointerException

0

から身を守るための正しい方法であるnull.doubleValue()NullPointerExceptionをスローしますので、2番目のケースでは全く走ったことはありません。いくつかの数学演算をラッパータイプ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 
関連する問題