2016-12-26 27 views

答えて

3

あなたは三条件式のタイプを決定するためのルールからの結果に遭遇した行動。あなたのケースでは

、表現

val == null ? val : val.intValue(); 

のタイプはintです。

これはJLS 15.25.によって指定される:

次のように条件式のタイプが決定される。

  • 第二及び第三のオペランドが同じタイプ(nullの可能性がある場合型)の場合は、それが条件式の型です。

  • 第2オペランドと第3オペランドのいずれかがプリミティブ型Tであり、他方がTにボクシング変換(5.1.7)を適用した結果である場合、条件式の型はT

あなたの第2オペランドがIntegerであり、あなたの第三オペランドがintあり、したがって、式の型はintです。

したがって、val == nullの場合、valはボックス化されていません(つまり、ヌル値の場合はval.intValue()が呼び出されます)。NullPointerExceptionがスローされます。あなたのif-else式val

がun-箱入りその値は、あなたがObject変数に代入するので(nullのときではないので、何のNullPointerExceptionありません。言っ

、あなたは整数の変数を割り当てているので、オブジェクト変数に、スニペットのいずれかで、あなたの条件は、(単に箱バックIntegerintObject変数にintを割り当てるので)無意味です。

あなたは、単に

を割り当てることができます

例外を除くと同じ結果が得られます。

+0

早急に対応していただきありがとうございます。 3番目の引数にIntegerオブジェクトを代入しようとしましたが、nullポインタ例外をスローせずにnullを割り当てます。 整数y = null; オブジェクトres = val == null? val:y; –