2011-07-19 6 views
2

私は奇妙なヌルポインタ例外を取得していますが、その理由を理解できません。このコードは正常に動作している間インライン条件文のヌルポインタ例外

Long test = null; 
Long result = true ? test : -1L; 

:私は2番目の行にNPEをスローするこの単純なテストコード、とそれを絞り込んこれは単に使用しないことによって避けることは十分に簡単です

Long result = true ? null : -1L; 

インラインの条件文ですが、なぜ誰にこのことが起こっているのかを私に説明することはできますか?

答えて

5

私はこれがunboxingになると思う。次のコードは動作します:

Long two = true ? test : new Long(-1); 

1つのパラメータが-1の場合、アンボックステストが行​​われ、両方が同じタイプとして扱われます。 Unboxing nullはnullポインタ例外を引き起こします。ステートメント内で特にnullの場合、それをアンボックスしようとするほどスマートになります。

+0

それは、ありがとう、それをしました。それはかなり混乱している。私はなぜJavaがそれらを同じタイプにする必要性を感じているのか分かりません。 –

+0

これは、三項演算子が動作する方法と同じように、両側が同じ型にキャストしなければならないので、両方が割り当てようとしているオブジェクトに戻ることができることを検証できます。 –

2

testの参照を解除して、longの値を取得しようとしていますが、それはできません。

0

私はそれがLangがlangをカプセル化するので起こると思います。だから、何らかの方法、あなたの表現は...いくつかのプロパティ、またはLongオブジェクトからlong値を取得するためにそのような何かをしようと...

ここにドキュメントを読んで:http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Long.html

は、それが助けを願っ:)

0

最初の例では、右側の式はlong型であると考えています(右側の定数のため)。したがって、autoboxingは、テストの値をlongとして投げて、NPEをスローします。

2番目の例では、すべてをすべて参照値として扱います。オートボクシングもクラッシュもありません。