• 締切済み

JAVAのコンストラクタの配列について

C言語をずっと勉強していて、最近JAVAを勉強しているものですが、卒研で以下の様なデータ構造のテストをする以下のようなプログラムを作りました。 import java.io.*; class Cell { public int statement; public String sentence; public Cell truth; public Cell fault; } class Cells { public String func_name; public int parent; public Cell cell[] = new Cell[100]; } public class architecture { public static void main(String args[]) { Cells cells = new Cells(); cells.parent = 0; cells.func_name = "main"; cells.cell[0].statement = 1; cells.cell[0].sentence = "a = b + c"; System.out.println("parent = "+cells.parent); System.out.println("func_name = "+cells.func_name); System.out.println("statement = "+cells.cell[0].statement); System.out.println("sentence = "+cells.cell[0].sentence); } } コンパイル時にはエラーはないのですが、実行するとエラーが起きます。 そのエラーメッセージがこれです。 Exception in thread "main" java.lang.NullPointerException at architecture.main(architecture.java:22) cellsのcell型の配列がうまく生成されていないようです。 どうすればよいでしょうか? ご教授ください。

みんなの回答

  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.2

public Cell cell[] = new Cell[100]; 問題はこの行だ。  Javaでは「cell」は「Cellクラスの配列」(つまり「Cell」型の変数の配列cell[])ではなくって、「Cellの配列クラス」(つまり「Cell[] 」型の変数cell)なんだ。どっちの書き方もできるけど、Javaが解釈する意味は後者だ。「どっちでも一緒じゃん」て思うかも知れないけど、ここを分かってないとハマる。  なので、new Cell[100]は「要素数が100個であるCellの配列クラスのインスタンスを1個作る」という意味であり、ここの要素に入っている値はnullだ。100個のnullを保持する配列インスタンスが1個出来上がる訳やね。なので、要素の中にそれぞれCellクラスのインスタンスを入れていってあげないといけない。 class Cells { public String func_name; public int parent; public Cell[] cell; public Cells(int length) { cell = new Cell[length]; for(int i = 0; i < length; i++) { cell[i] = new Cell(); } } } てな感じにしてあげるとうまく動くでしょう。

i04_kof02
質問者

お礼

お返事遅くなってしまいすみませんでした。 なるほど。 なんとなく配列の扱い方がわかりました。 型宣言の説明がとてもわかりやすかったです。 ありがとうございました。

  • itotyun
  • ベストアンサー率71% (5/7)
回答No.1

「public Cell cell[] = new Cell[100];」は Cell型の配列が確保されるだけで 各要素にCellオブジェクトが作られるわけではありませんので 生成しなければなりません。 初めからCellを100個用意するのであれば、 Cellsの初期化時に生成すると良いでしょう。 class Cells { public String func_name; public int parent; public Cell cell[] = new Cell[100]; public Cells() { super(); this.cell[0] = new Cell(); this.cell[1] = new Cell(); this.cell[2] = new Cell(); /// : this.cell[99] = new Cell(); } }

i04_kof02
質問者

お礼

お返事遅くなってすみませんでした。 Cでいう構造体はこうやって一つのクラス内で生成した方がすっきりするようですね。 ご教授ありがとうございました。