プロが教えるわが家の防犯対策術!

java初心者です。
*******************************************
Exception in thread "main" java.lang.NullPointerException
at Region2.<init>(Region2.java:7)
at Region2.main(Region2.java:11)
*******************************************
というエラーで困っています。
ソースは、
*******************************************
import java.io.*;

public class Region2 {
 public Test[] t = new Test[10];

 public Region2(){
  t[0].x = 1;//ココ
  System.out.println(t[0].x);
 }
 public static void main(String[]args){
  Region2 reg = new Region2();//ココ
  System.out.println(reg.t[0].x);
  System.exit(0);
 }
}
class Test{
 public int x;

 public Test (int x){//xをセット
  this.x = x;
 }
 public void Show () {//xを表示
  System.out.println(x);
 }
}
****************************************

見ての通りのプログラムで、あまり意味のないものですが、オブジェクトの配列の動作をテストしています。でずが、「ココ」とコメントしたところでたたかれてしまいます。私は恥ずかしながら「え?何でダメなの?」という感じです。

何がいけないのか、もしくはどうすれば、
1
1
と表示されるか、どなたかアドバイスください。

A 回答 (1件)

今アルコール入ってるんで、


回答の妥当性はそちらでチェックしてくださいね。

これは
public Test[] t = new Test[10];
のところで、「配列tができた」と思っていたところが
できていなかったのが原因です。

Javaのオブジェクトというのは、宣言しただけでは使えなくて、
newしなくてはならないというのはおわかりですね?
つまり、Abcというクラスがあった場合、
Abc a;
だけでは使えなくて、
Abc a = new Abc();
のようにしなくてはなりません。

配列を宣言したというのは、
「配列の変数を宣言しただけ」なのです。
「Javaの配列はテーブルタップのようなもの」
というたとえがあります。
テーブルタップには、実際に使う電化製品をつながないといけません。

public Test[] t = new Test[10];
では、「配列の変数が宣言された」だけです。

具体的には、
t[0] = new Test(...);
t[1] = new Test(...);
...
t[9] = new Test(...);
のようにします。こうしないと、配列の要素の各オブジェクトは存在しません。
(for(int i = 0; i < 10; i++){
t[i] = new Test(...);
}
でもいい。)

t[0].x = 1;
のところでは、存在しないオブジェクトのフィールドに値を代入しています。
だからエラーになります。
    • good
    • 0
この回答へのお礼

とてもわかりやすい御説明、ありがとうございます。

なるほど!ともやもやしたものが一気になくなりました。

C言語でいう、ポインタは宣言したけど、肝心のポインタの中身はNULLだよといった感じだったのですね。(こんなことを言っているからなかなかオブジェクト指向になれられないのですが・・)

オブジェクトを生成していないし、参照先も登録してなかったわけですよね。また何かありましたらよろしくお願いします。

お礼日時:2004/10/13 21:30

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!