-1

私には2つの変数があります:

final Long a;
if(...) {
     a = ...;
} else
     a = null;
String b  = "A";
....

その後、別の割り当てに:Longをスローします。NullPointerException

final Long c = b.equals("B")? a*1000: a;

私はそうなることを期待しcています、そして私はそれが逆参照されるのを防ぐためにこれらの状況にないことを知っていることを期待しています。nullanullbB

では、なぜそれがスローされるのNullPointerExceptionですか?

更新:謎が解決され、テナリーオペレーターでの自動アンボックス化。https://stackoverflow.com/a/13627200/15721を参照して

4

3 に答える 3

3

の場合、それがそうでaあるnullように、それは投げるLongと評価されますnull.longValue()NullPointerException

編集:

乗算を行っているので、三項演算子はlongと評価され、2番目の分岐に進んだとしても、 (ボックス化されていない)aと評価されると思います。long

Edit2: あなたは最終的にあなた自身の答えを見つけるのが速かった;)

于 2012-11-29T13:38:33.923 に答える
1

あなたがするときa * 1000aは箱から出されます。

したがって、の場合、!aをスローします。nulla * 1000NullPointerException

于 2012-11-29T13:38:45.347 に答える
1

ああ、動作するコードを見つけることから、何が起こっているかを推測できます。

Long a = ....; 
Long b = ... a != null? a*1000: a;

a*1000はunboxing であるためa、10 項式は ではありlongませんLong

Long a = ....; 
Long b = ... a != null? new Long(a*1000): a;

Tenary の結果Longを保持し、期待どおりに機能します。

于 2012-11-29T13:46:57.127 に答える