NullPointerException
先日、三項演算子の予期しない型キャストが原因で、本当に奇妙なことに遭遇しました。この(役に立たない模範的な)関数を考えると:
Integer getNumber() {
return null;
}
コンパイル後、次の2つのコードセグメントが完全に同一になることを期待していました。
Integer number;
if (condition) {
number = getNumber();
} else {
number = 0;
}
対。
Integer number = (condition) ? getNumber() : 0;
。
の場合、 -ステートメントcondition
は正常に機能しますが、2番目のコードセグメントの三項演算子は。をスローします。三項演算は、結果を自動ボックス化して!?!に戻す前に、両方の選択肢を型キャストすることを決定したようです。実際、明示的にtoをキャストすると、例外はなくなります。言い換えると:true
if
NullPointerException
int
Integer
0
Integer
Integer number = (condition) ? getNumber() : 0;
と同じではありません:
Integer number = (condition) ? getNumber() : (Integer) 0;
。
if-else
したがって、三項演算子と同等のステートメント(私が予期していなかったもの)の間にはバイトコードの違いがあるようです。これは3つの質問を提起します:なぜ違いがあるのですか?これは三項実装のバグですか、それとも型キャストの理由がありますか?違いがあるとすると、三項演算は同等のステートメントよりも多かれ少なかれパフォーマンスが高くなりますかif
(私は知っていますが、違いは大きくはありませんが、それでも)?