ソフトウェアエンジニア現役続行

雑多なことを綴ります

クラスオブジェクトの配列を使うときの注意点

int型の配列を使うときは以下のようにします。これは問題ないですね。

int[] array = new int[10]; // (1)

しかし自分で定義したクラスのオブジェクトの配列を使う場合は、同じようにしてもうまくいきません。

class NewClass{
  int a;
  int b;
}

public static void main(String[] args)
{
  NewClass[
] dim = new NewClass[3]; // (2)


  dim[0].a = 1;
  dim[0].b = 10;
  dim[1].a = 2;
  dim[1].b = 20;
  dim[2].a = 3;
  dim[2].b = 30;
}

(1)と同様に(2)と書いたのに、これを実行するとNull Pointer Exceptionが発生してしまいます。

調べたところ、(2)は、オブジェクトを入れるための配列を宣言しただけであり、配列の各要素にnewされたオブジェクトが格納されてはいないことが分かりました。それで、空となっている配列の中身にアクセスして、Null Pointer Exceptionが発生していました。

正しくは以下のようにします。

class NewClass{
  int a;
  int b;
}

public static void main(String args)
{
  NewClass[
] dim = new NewClass[3]; // (2)


  /* 以下の2行が追加されました */
  for( int i = 0; i < 3; i++)
    dim[i] = new NewClass();


  dim[0].a = 1;
  dim[0].b = 10;
  dim[1].a = 2;
  dim[1].b = 20;
  dim[2].a = 3;
  dim[2].b = 30;
}

あちこち調べたのですが、このことについて言及しているサイトがなかなか見つかりませんでした。あまりこれで悩む人がいないのでしょうか。

僕は30分ほどインターネットで探し回った末に、Java House Mailing Listに書いてあるのを発見しました。「Null Pointer Exception について」というスレッドです。