2016-11-21 11 views
1

私はグリッドを形成するために2D配列のTileオブジェクトを格納するクラスマップを使用するプログラムで作業しています。タイルクラスで2Dクラスの配列がnullです

public class Map { 
    private int x = 80; 
    private int y = 40; 
    //store the entire map - a 50x50 2d array 
    private tile[][] grid = new tile[x][y]; 
    public void Map() { 
     initialize(); 
     grid[0][0].tile('.'); 
    } 

    public void initialize() { 
     for (int i = 0; i < y; i++) { 
      for (int j = 0; j < x; j++) { 
       grid[j][i] = new tile(); 
      } 
     } 
    } 
    public void display() { 
     for (int i = 0; i < y-1; i++) { 
      for (int j = 0; j < x-1; j++) { 
       System.out.println("Pass [" + j + "][" + i + "]"); 
       System.out.print(grid[j][i].c()); 

      } 
      System.out.println(); 
     } 
    } 
} 

:マップクラスで

System.out.print(grid[j][i].c()); 
:ラインを強調し

Pass [0][0] 
Exception in thread "main" java.lang.NullPointerException 
    at Map.display(Map.java:22) 
    at rogue.main(rogue.java:7) 

public class tile { 
    private String title = "null"; 
    private int id = 0; 
    private char c = ' '; 
    private boolean isVis = false; 

    public tile() { 
     id = 1; 
     format(id); 
    } 

    private void format(int n) { 
     c = 'A'; 
     title = "foo"; 
     isVis = false 
    } 

    public char c() { return c; } 
} 

プログラムを実行している、私はの出力を取得します

私が起こっていることは、一度作成されるとクラスインスタンスが初期化されます。私が印刷したばかりのとき

"nullnullnull"でいっぱいのページを返します。オブジェクトが正しく初期化されるようにするにはどうすればよいですか?

+1

変更、それが質問を投稿する前に、あなたのデバッガでコードをステップ実行のポイントを作ります。 10回中9回、あなたの質問に答えます。 *これは時間がかかるかもしれませんが、おそらくそうかもしれません。 'Map'のあなたのコードが決して実行されなかったことに気づいたでしょう。おそらくそれはあなたを以下の答えに導きます。 –

+0

私は数時間試してきました。申し訳ありませんが、私は複数のクラスで作業するにはちょっと新しいです。 Stackexchangeは常に私の最後の手段です。 –

答えて

4
public void Map() 

(それは通常の方法だ)コンストラクタではないので、あなたがMapインスタンスを作成するときにそれが呼び出されていない、とあなたのinitializeメソッドが呼び出されることはありません。

public Map() 
+1

...理想的には、オーバーライド可能なメソッドを呼び出すコンストラクタがありません。 –

+0

くそー私はそれを書くのは馬鹿だと感じます。ありがとうございました! –