質問

重複の可能性:
ブール値、条件演算子、オートボクシング
Java、Googleコレクションライブラリ;AbstractIteratorに問題がありますか?

以下のコードはNPEを生成します: ジェネラコディセタグプレ

例外なく「null」を正しく印刷するには、次のコードが必要です。 ジェネラコディセタグプレ

最初の例では、「test」がボックス化されていない(ネイティブintに変換されている)ことは明らかですが、なぜですか?そして、なぜ三項演算子の他の式を変更すると(2番目の例のように)それが修正されるのですか?両方の例の内容がボックス化およびボックス化解除される正確な時期、内容、および理由について、誰かが何らかの物語を提供できますか?

役に立ちましたか?

解決

Java言語仕様のセクション15.25から

条件式のタイプは次のように決定されます:

  • 2番目と3番目のオペランドが同じ型(null型の場合もあります)の場合、それが条件式の型です。
    • 2番目と3番目のオペランドの1つがブール型で、もう1つのオペランドの型がブール型の場合、条件式の型はブール型です。
    • 2番目と3番目のオペランドの1つがnull型で、もう1つの型が参照型の場合、条件式の型はその参照型です。
    • それ以外の場合、2番目と3番目のオペランドに数値型に変換可能な型(§5.1.8)がある場合、いくつかのケースがあります。
      • オペランドの1つがbyte型またはByte型で、もう1つがshort型またはShort型の場合、条件式の型はshortです。
      • 一方のオペランドがT型で、Tがbyte、short、またはcharであり、もう一方のオペランドがint型の定数式であり、その値がT型で表現できる場合、条件式の型はTです。 。
      • 一方のオペランドがByte型で、もう一方のオペランドがint型の定数式であり、その値がbyte型で表現できる場合、条件式の型はbyteです。
      • 一方のオペランドがShort型で、もう一方のオペランドがint型の定数式であり、その値がshort型で表現できる場合、条件式の型はshortです。
      • オペランドの1つが型の場合。文字と他のオペランドは、値がchar型で表現可能なint型の定数式である場合、条件式の型はcharです。
      • それ以外の場合、2進数値プロモート(§5.6.2)がオペランドタイプに適用され、条件式のタイプは2番目と3番目のオペランドのプロモートされたタイプです。 2進数の昇格は、ボックス化解除変換(§5.1.8)と値セット変換(§5.1.13)を実行することに注意してください。

        つまり、最後の箇条書きに従って、ボックス化解除変換を実行する2進数のプロモーションを実行します。したがって、条件演算子式のタイプは、intに割り当てている場合でも、Integerです。 nullでボックス化解除変換を実行しようとしているため、例外です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top