16

例えば:

int anInt = null;

コンパイル時に失敗しますが、

public static void main(String[] args) {
  for (int i = 0; i < 10; i++) {
    System.out.println("" + getSomeVal());
  }
}
public static int getSomeVal() {
   return new Random().nextBoolean() ? 1 : null;
}

実行時に (通常) 失敗します。ただ返そうとするとコンパイル エラーが発生するため、複数のパスがあり、それが潜在的に autoboxednullであるとコンパイラに推測させる何かがあると思います。javac が同じエラーで両方のケースのコンパイルに失敗しないのはなぜですか?nullint

4

3 に答える 3

20

最初のケースでは、コンパイラは、コンパイル時定数 のボックス化を解除しようとしていることを認識していますnull

2 番目のケースでは、条件式の型が であるIntegerため、効果的に次のように記述しています。

Integer tmp = new Random().nextBoolean() ? 1 : null;
return (int) tmp;

...したがって、ボックス化解除は定数式で行われておらず、コンパイラはそれを許可します。

そこintをボックス化解除して条件式を型にするように変更すると、失敗します。

// Compile-time failure
return new Random().nextBoolean() ? 1 : (int) null;
于 2012-08-10T08:23:42.487 に答える
2

ボクシングは、プリミティブと対応するラッパー オブジェクトの違いを部分的に隠しますが、それを取り除くわけではありません。

ボクシングによって変更されない 2 つの違いがあります。

  • オブジェクトは null にできますが、プリミティブは null にできません
  • オブジェクトには状態と ID の両方がありますが、プリミティブには状態 (値) しかありません。

これらの違いは、ボクシングを使用する際に問題を引き起こすことがあります。

覚えておくべきいくつかのポイント:

  • ヌルには注意してください。null オブジェクトを自動アンボックスすると、NullPointerException.
  • とのアイテムの比較は慎重に行う必要があります==equals
于 2012-08-10T08:25:01.227 に答える
1

null を int に代入することはできません

    int anInt = null;

nullをintに割り当てていないため、Javaはこれを許可します

    System.out.println("" + getSomeVal()); //null was just converted to a srting and was printed

これを実行すると、エラーが発生する可能性があります

    int anInt = getSomeVal();
于 2012-08-10T08:33:59.973 に答える