ホーム > プログラム > Java

Javaのアーカイブ

JavaのInteger等のプリミティブ型ラッパクラスには要注意!

Check

基本的なことだけど、Javaには、プリミティブ型とオブジェクト型がある。
プリミティブ型とは、boolean, int, long, double, floatとか。
それに対応するように、Boolean, Integer, Long, Double, Floatクラスがある。

これらのプリミティブ型とオブジェクト型、何が一番違うかというと、nullが入るかどうか(表現が変だけど)。
つまり、

int a = null; //コンパイルエラー
Integer b = null; //OK

ということだ。

あと、よく使われるのが、

List<Integer> list = new ArrayList<Integer>();
list.add(1);

for (int i : list) {
	System.out.println("i=" + i);
}

といったように、Collectionに数値を入れたい場合に使う。
JDK1.4以降からの機能で、プリミティブ型の変数にオブジェクト型のオブジェクトをコード上はそのまま入れられるようになった。
しかし、ここで注意!

最初に言ったように、Integerには、nullが入る。
けど、intにはnullは入らない。
なので、この例の場合、listというArrayListに、nullが入っている場合、
for文のところで、NullPointerExceptionが発生する。
このパターンで、NullPointerExceptionが発生した場合、
debug等で見つけるのがちょっとわかりにくい。
もしくは、Collectionから取り出したInteger等の変数を、
プリミティブ型の引数を持ったメソッドに渡した場合なども、
どこでNullPointerExceptionが発生しているのか、発生源を特定するのが難しいのだ。

アタリマエのことなのだけど、
あまり気にしてないとハマるので、覚書。

ホーム > プログラム > Java

Tag cloud
Amazon
いろいろ

ページの上部に戻る