Javaでいつも引っかかるListのループ
ちょっとプログラマー的な話。システムエンジニアになって既に10年くらい立つんですが、どうしても引っかかってしまうことがいくつかあるので、その一つをご紹介。
現在の主流言語はJavaですが、AndroidSDK...つまりAndroid開発も基本はJavaです。Swift(iOS)も似てるといえば似てるけど、どちらかといえばあれはC++に似てる。なんかA氏もよくやってしまうバグで盛り上がったんで、備忘録代わりにご紹介。とはいうものの、こういった直接的なプログラムの話をしてもここのブログの閲覧者で理解出来る人は少ないと思われるので、そんなに長くは話しません。
List<String> list;の値を順番に表示したいときに考える動作方法は、以下の通りです。
//動作①
for(int iCount=0; iCount<list.size(); iCount++){//カウントをし、そのカウントがリスト最大値になったらループをやめる
System.out.println(list.get(iCount));
}
//動作②
for(String str:list){//リストの中身をstrに毎ループ展開し、なくなったらループをやめる
System.out.println(str);
}
で、通常上記動作をする前に
List<String> list = new ArrayList<String>();
でリストを宣言します。
動作①②、両方とも同じ結果が出ます。当方は、カウント値を取りたいときに動作①、そうでないときは動作②で実装するのが常なんですが、実はこれ、listのインスタンスが生成されていれば落ちません。
ただしlistがNULLの時、動作②はNullPointerExceptionで落ちます。しかもインスタンスさえ生成していれば、リストの中のStringがNULLであっても上のソースでは落ちないという混乱仕様!
この問題、私が新人に対して教えるときに上のような動作の説明をしてくださいって毎年出してます。List<String> listに対してインスタンスを生成(getInstanceとか、newとか)するのは、基本は普通でありますが、なぜだめなのかなぜおちるのかっていうのを理解するのは、教えるよりやってみた方が早いんだろうなぁといつも思ってます。
たまのプログラミング講座はここまで。でわでわ。