試験に備えて Java を勉強していたところ、初期化されていない int/Integer 値に関する問題に遭遇しました。
class A
{
int x;
Integer y;
static int z;
static Integer z2;
public A(){}
}
クラス A のオブジェクトを初期化するとします。A a = new A();
これをコンパイラで試してみたところ、次のような結果が得られました
a.x == 0; true
a.x == null; Static Error: Bad type in comparison expression
a.y == 0; java.lang.NullPointerException
a.y == null; true
a.z == 0; true
a.z == null; Static Error: Bad type in comparison expression
a.z2 == 0; NullPointerException
a.z2 == null; true
さらに、インタラクション ペインで初期化されていない int/Intger の比較をいくつか試して、x、y が上記のようにクラス インスタンス変数でない場合、異なる結果が得られるかどうかを確認しました。
int x;
Integer y;
x == 0; true
x == null; Static Error: Bad type in comparison expression
y == 0; java.lang.NullPointerException
y == null; true
しかし、私の教授は講義の中で、値は次のようになるべきだと主張しています。
x == 0; Uninitialized
x == null; Undefined
y == 0; java.lang.NullPointerException
y == null; Uninitialized
試験を書いた人を疑いたくはありませんが、x == 0 と y == null の真理値はどちらが正しいのでしょうか? 理由の説明をいただければ幸いです。ありがとうございます。
ベストアンサー1
a.x == 0
- ax のデフォルト値は 0 なので True です。a.x == null
- 前述の通り、これはコンパイル時のエラーです。これは、§15.21.3: 「キャスト変換によっていずれかのオペランドの型を他のオペランドの型に変換できない場合、コンパイル時エラーが発生します (§5.5)。」 null 型は数値に変換できません。a.y == 0
- これは null である unbox を試行するためa.y,
、NullPointerException がスローされます。上記 (リテラル null を持つ) とは異なり、コンパイラはコンパイル時にa.y
null になるものを把握しようとしません。a.y == null
- 再び、a.y
nullに初期化されているのでtrueですa.z == 0
- 同じa.x
(静的を除く)a.z == null
- 同じa.x
(静的を除く)a.z2 == 0
- 同じa.y
(静的を除く)a.z2 == null
- 同じa.y
(静的を除く)
インタラクション ペインの問題は、それをどのように実装するかが IDE 次第であることです。x と y がローカル (初期化されていない) 変数である場合、最後の 4 つの比較はすべてコンパイルに失敗します。