10

このコードが機能する理由

Float testFloat = null;
Float f = true ? null : 0f;

そして、なぜこれは例外をスローするのですか?

Float testFloat = null;
Float f = true ? testFloat : 0f;

しかし、最も奇妙なことは、このコードも例外なく正常に実行されることです。

Float testFloat = null;
Float f = testFloat;

Javaの三項演算子で挙動が変わるようです。これがなぜなのか、誰か説明できますか?

4

1 に答える 1

16

動作はJLS - Conditional Operatorで指定されています:

2 番目と 3 番目のオペランドの一方がプリミティブ型 T で、もう一方の型が T にボックス化変換 (§5.1.7) を適用した結果である場合、条件式の型は Tです。

鉱山を強調します。したがって、2番目のケースでは:

Float f = true ? testFloat : 0f;

第 3 オペランドはプリミティブ型( T) であるため、式の型は float 型 - になりTます。そのため、現在参照されているtestFloatをボックス 化解除すると、 NPEが発生します。nullfloat


最初のケースに関しては、関連する部分は最後のものです:

それ以外の場合、2 番目と 3 番目のオペランドの型はそれぞれ S1 と S2 です。T1 を S1 にボックス化変換を適用した結果の型とし、T2 を S2 にボックス化変換を適用した結果の型とする。条件式の型は、キャプチャ変換 (§5.1.10) を lub(T1, T2) (§15.12.2.7) に適用した結果です。

したがって、これによると:

null type - S1
float     - S2

null type - T1 (boxing null type gives null type)
Float     - T2 (float boxed to Float)

そして、条件式の型は - になりFloatます。のボックス化解除はnull必要ないため、NPE.

于 2013-07-29T21:31:41.760 に答える