1

重複の可能性:
Java条件演算子?:
自動ボクシングによる結果タイプNullPointerException-Java三項演算子の動作

私には2つの機能があるとしましょう:

f(MyObject o) { ... }
f(int i) { ... }

そして私はそれらをこのように呼びます:

f(someCondition ? 10 : null);

これはコンパイルされますが、実行するとnullポインター例外が発生します(申し訳ありませんが、どの条件であるかわかりません)。私の質問のいくつかは次のとおりです。

  1. なぜそれもコンパイルするのですか?の種類はfoo ? 10 : null何ですか?
  2. NPEが発生しないため、明らかに「正しい」関数は呼び出されません。では、どの関数を呼び出しているのでしょうか。それはしますf((MyObject)10);f((int)null)
4

2 に答える 2

2
  1. タイプはInteger-オートボクシングは10に行われます。
  2. f(int)が呼び出されます。これは、使用可能なIntegerからの唯一の受け入れられたキャストであるためです(他のオーバーロードがないと仮定し
    ます)。をにキャストしようとするとnullintNPEが取得されます。

2. f(Object)Integerはオブジェクトであるため、呼び出されます。これは参照型の拡大
と呼ばれます(最初の間違いで申し訳ありませんが、次のように読んでくださいf(Object)

于 2012-10-25T13:01:46.467 に答える
2

まず第一に、この問題は、のバージョンがオーバーロードされているという事実とは何の関係もありませんf。のバージョンのみを使用している場合はfint同じ問題が発生します。

:つまり、式全体condition ? expr1 : expr2が単一の型である必要があるため、3値式(の前後)の両方の可能な結果は同じ型である必要があります。この式を、あるタイプのisと評価し、別のタイプのconditionisと評価することはできません。truefalse

したがって、Javaコンパイラは、単一の型に変換できるかどうかを確認しexpr1ますexpr2。(プリミティブ型であるため)intできないことに注意してください。nullただし、オートボクシングを介して10に変換することができ、またすることができます。したがって、三元式全体のタイプはタイプであると判断されます。結果は、値を含むanまたはであるのいずれかです。IntegerIntegernullIntegerInteger10Integernull

ステップ2は、これをに渡すことIntegerですffを取るのでint、自動的に箱から出されます。

それを自動でアンボックス化するIntegernullNullPointerException-が表示されます。これがここで発生します。

于 2012-10-25T13:13:25.833 に答える