Javaのアーカイブ
JavaのInteger等のプリミティブ型ラッパクラスには要注意!
Tweet
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が発生しているのか、発生源を特定するのが難しいのだ。
アタリマエのことなのだけど、
あまり気にしてないとハマるので、覚書。