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

解決済みの質問

java.lang.NullPointerException

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
と表示されるか、どなたかアドバイスください。

投稿日時 - 2004-10-13 20:43:16

QNo.1040737

暇なときに回答ください

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

今アルコール入ってるんで、
回答の妥当性はそちらでチェックしてくださいね。

これは
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;
のところでは、存在しないオブジェクトのフィールドに値を代入しています。
だからエラーになります。

投稿日時 - 2004-10-13 21:04:34

お礼

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

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

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

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

投稿日時 - 2004-10-13 21:30:35

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

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

回答(1)