こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

配列について

javaの勉強をしています。
名簿のような情報を操作したいのですが、

以下のようなクラスを作りました。

class Rec {
public String name; //名前
public String tel; //電話番号

Rec() {

}

}


そして、

Rec r = new Rec[5];
のようにして、この中に情報を5人分、入れようとしているのですが、

r[0].name = "AAAAA";
r[0].tel = "123456789";

を実行するとNullPointerExceptionで以上終了してしまいます。

よろしくお願いいたします。

投稿日時 - 2004-02-16 15:48:19

QNo.781127

暇なときに回答ください

質問者が選んだベストアンサー

始めに、念のため、
 Rec r = new Rex[5];
ではなくて、
 Rec[] r = new Rec[5];
または
 Rec r[] = new Rec[5];
ではないでしょうか。

コンパイルできているようなので、この辺は大丈夫でしょう。
●さて、ご質問の件ですが、

 Rec[] r = new Rec[5];

では、配列の準備ができているだけです。
中身のオブジェクトはないので、いきなり
r[0].name = "AAAA";
という作業はできません。

●オブジェクトが用意されていない・・・、
オブジェクトを指すポインタがありませんよ、ということで、
 「java.lang.NullPointerException」
というエラーメッセージで、Javaクンが訴えている訳です。

配列内に実際にRecオブジェクトを生成してあげてください。

r[0] = new Rec();

という1行を入れると、
r[0].name = "AAAA";
r[0].tel = "123456789";

が実行できます。

●もちろん、このままではr[1], r[2], r[3], r[4]はまだオブジェクトは用意されていないので使えません。

なので、以下のようにすると正常に配列【r】を扱うことができます。

Rec[] r = new Rec[5];
for(int i=0; i<5; i++){
r[i] = new Rec();//Recオブジェクト生成
}

この後、配列r をいろいろ操作する。

★補足
余裕ができたら、Recクラスのnameやtelへの代入は、直接
 r[0].name = "AAAA";
とするのではなくて、
 r[0].setName("AAAA");
のような形で値を代入できるように工夫するといいですよ。

投稿日時 - 2004-02-16 16:24:42

お礼

返答ありがとうございました。
基礎がわかっていないことがはっきりわかりました。
もっと勉強します!

投稿日時 - 2004-02-17 17:34:06

ANo.1

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

Javaの参照型の場合、配列を宣言しても、オブジェクトは生成されません。
生成されるのは、オブジェクトへの参照を代入できる変数だけです。

配列でない変数にたとえると、
AClass a;
と宣言しているだけで、
AClass a = new AClass();
とはなっていない、というようなものです。

「Javaの参照型配列はテーブルタップのようなものだ」
と言った人がいます。
参照を代入するところだけ作られて、中身はまだです。

これに対して、プリミティブ型の配列は、
中身の変数も生成されます。
たとえば
int [] = new int[10];
とした場合、int型の変数10個ができています。
このへんがややこしいところです。

投稿日時 - 2004-02-16 17:49:38

お礼

返答ありがとうございました。
配列は、やや不得意になりそうですが、
しっかり理解したいと思います。

投稿日時 - 2004-02-17 17:37:32

あなたにオススメの質問