• 締切済み

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型の配列がうまく生成されていないようです。 どうすればよいでしょうか? ご教授ください。

  • Java
  • 回答数2
  • ありがとう数3

みんなの回答

  • 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でいう構造体はこうやって一つのクラス内で生成した方がすっきりするようですね。 ご教授ありがとうございました。

関連するQ&A

  • Javaのコンストラクタについて教えてください

    Javaを勉強している初心者です。 次のようなプログラムがあります。 このプログラムでclass aおよびclass bのデフォルトコンストラクタ a() {}とb() {}をコーディングしていないとコンパイルエラーになります。 b() {}についてはclass bのパラメータのあるコンストラクタb(String s)がサブクラスclass cから明示的に呼ばれていないのでデフォルトコンストラクタb() {}をコーディングしないとエラーになる…と考えればよいのでしょうか。 それでは、a() {}はなぜ必要なのでしょうか。 どなたか教えてください。 class a { a() {} a(String s) { System.out.println("In a's constructor..."); System.out.println(s); } } class b extends a { b() {} b(String s) { super(s); System.out.println("In b's constructor..."); System.out.println(s); } } class c extends b { c(String s) { System.out.println("In c's constructor..."); System.out.println(s); } public void some() { System.out.println("something..."); } } public class appJ01 { public static void main(String args[]) { c obj = new c("Hello from Java!"); } } 

  • JAVAコンストラクタについて

    JAVA のコンストラクタ定義の際に、下記のようにコンストラクタにvoidを付けた時と付けない時の処理結果が変わるのはなぜでしょうか。 (1) class O { protected int d; O(){ System.out.println("O = " + d); } } class Study_6_3main_void { public static void main(String args[]) { int i = 1; O OO = new O(); System.out.println("O = "); } } (2) class O { protected int d; void O(){ System.out.println("O = " + d); } } class Study_6_3main_void { public static void main(String args[]) { int i = 1; O OO = new O(); System.out.println("O = "); } } 実行結果 (1) O = 0 O = (2) O = 以上です。回答の程よろしくおねがいします。

    • ベストアンサー
    • Java
  • java 入力命令

    以下うまくどうさしません、教えてください。 public class Main { public static void main(String[] args){ System.out.println("名前"); String name = new java.util.Scanner(System.in) .nextLine(); System.out.println("年齢"); int age = new java.util.Scanner(System.in) .nextInt(); System.out.println (age + name); } }

  • 配列の変換について

    こんにちは、お世話になります。 次のコードで、どうしてint[] i = {1,2,3};が int[] i = new int[3]; int[0] = 1; int[1] = 2; int[2] = 3; のようになるのか分かりません。お分かりの方よろしくお願いします。 class arr{ public static void main(String[] args){ String[] name = new String[3]; name[0] = "1番目"; name[1] = "2番目"; name[2] = "3番目";      System.out.println("nameの0:" + name[0]); System.out.println("nameの1:" + name[1]); System.out.println("nameの2:" + name[2]); int[] i = {1,2,3}; System.out.println("iの0:" + i[0]); System.out.println("iの1:" + i[1]); System.out.println("iの2:" + i[2]); char c[] = new char[1]; c[0] = 'A'; System.out.println("cの0:" + c[0]); } }

  • java 配列について

    public class Sample{ public static void main( String[ ] args ){ String x = "pen"; String[] y = new String[1]; y[0] = x; x = "pencil"; System.out.println(y[0]); } } java初心者です。 配列の参照先を変更して 配列の数を変更せず配列0に 実行時にpencilと表示させたいのですが よい方法はありますでしょうか?

    • ベストアンサー
    • Java
  • JavaでXMLといったら何を使いますか?

    JavaでXMLファイルを取り扱うときには、DOM, SAX, xerces, relaxer, XMLSchema, XPathといったキーワードが出てきますが、とりあえずXMLファイルを読めればいい、というときはどのライブラリを使うのがいいのでしょうか? 利用目的としては、単純なXMLからデータを読み込んで、それをVelocityテンプレートとマージしてファイルに保存することを考えています。 例 <javafile>  <name>Foo.java</name>  <class>   <modifier>public</modifier>   <name>Foo</name>   <method>    <modifier>public</modifier>    <modifier>static</modifier>    <type>void</type>    <name>main</name>    <arg>     <type>String[]</type>     <name>args</name>    </arg>    <body>     System.out.println("Hello");    </body>   </method>  </class> </javafile> から public class Foo{  public static void main(String[] args){   System.out.println("Hello");  } } を作る感じです。

    • ベストアンサー
    • Java
  • JAVAについて

    現在JAVAについて学んでいるのですが、下記のソースが実行出来ません。どなたかわかる方、回答宜しくお願いいたします。 public class Lound { void main(String[] args) { String rtn = methWithParamReturn(3); if(rtn.equals("0")) System.out.println("0あかんよ"); else System.out.println(rtn); } public String methWithParamReturn(int x) { System.out.println(x); x= x*x; String str = String.valueOf(x); return str; } }

  • コンストラクタについて

    これも試験問題らしくて自分でやってみましたのであってるかどうか自信なくて どなたかみてみていただけたらと思います.よろしくお願いします。 下のソースファイルをコンストラクタを用いたものに修正しなさい class Sconst{ int x,y,z; void print(){ System.out.println(x); System.out.println(y); System.out.println(z); } } class ExConstTest{ public static void main (String[] args ){ Sconst sc=new Sconst(); sc.x=10; sc.y=30; sc.z=5; } } ------------------------------------------------------------- class Sconst{ int x,y,z; Sconst(){ x=10; y=30; z=5; } } class ExConstTest{ public static void main (String[] args ){ Sconst a1; Sconst a2; Sconst a3; a1=new Sconst(); a2=new Sconst(); a3=new Sconst(); System.out.println(a1.x); System.out.println(a2.x); System.out.println(a3.x); } }

    • ベストアンサー
    • Java
  • Javaについて教えてください!

    sampleパッケージに属するMain.javaとSub.javaがあり、Main.javaのmainはSub.javaのsubメソッドを呼び出して「OK」と表示させるプログラムを教えてください! //Main.java package sample; public class Main{ public static void main(String[] args){ Sub.sub(); }} //Sub.java package sample; public class Sub{ static String str = "OK"; public static void sub(){ System.out.println(str); }} String型の変数strはクラス変数で行いたいのですが、どこを改善すれば良いでしょうか?

    • ベストアンサー
    • Java
  • Java

    昨日から「やさしいJava」という本をつかって勉強を始めた者です。 最初からなにか上手くいかないので、アドバイスいただけたら嬉しいです。 public class Welcome{ public static void main(String[] args){ System.out.println("Welcome to Java!"); System.out.println("Javaの世界へようこそ!"); } } というソースを作りました。 これを javac Welcome.java とやって、そこまではよさそうなのですが、そのあと、 java Welcome をやったらエラーになります。 ソースも間違いないと思うのですが、よくわかりません。 ファイルの仕方に問題があるのかなとも思っています。 どうか、よろしくお願い致します。

    • ベストアンサー
    • Java