2012-12-24 157 views
-1

我正在試圖製作一款需要你放置塊的遊戲,類似於Minecraft。但是,我試圖創建一個多維數組,它將存儲放置的塊的x和y座標,我一直在遇到一些麻煩。代碼如下:訪問多維數組時拋出NullPointerException

public Block[][] blocks = new Block[maxBlockX][maxBlockY]; 

它給了我一個空指針異常。以下例外情況如下。

Exception in thread "main" java.lang.NullPointerException 
    at net.lojana.src.World.loadWorldAsReg(World.java:16) 
    at net.lojana.client.SpriteCraft.display(SpriteCraft.java:45) 
    at Run.main(Run.java:5) 

這是在我的世界級引用以下方法loadWorldAsReg()。方法在這裏。

public void loadWorldAsReg() { 
    for (int x = 0; x < maxBlockX; x += 20) { 
     for (int y = 0; y < maxBlockY; y += 20) { 
      blocks[x][y].draw(); 
     } 
     } 
} 

它也引用下面的方法。

public void draw() { 
    getTexture().bind(); 
    shapes.drawSquare(new Point(x, y), new Point(x + 20, y + 20)); 
} 

有沒有人有想法如何解決這個奇怪的錯誤? 非常感謝!

+0

這些方法中的每一種都會引用什麼?什麼是'maxBlockX'和'maxBlockY'被定義爲? –

+0

「World」類的第16行是'blocks [x] [y] .draw();' – user1921838

回答

3

你的陣列充滿了null s。

您需要先爲陣列中的每個元素創建一個Block實例。

+0

我該怎麼做?我會做一個循環遍歷整個數組,將值設置爲選定的塊嗎? – user1921838

+0

非常感謝你SLaks! :D--它不會讓我接受?! – user1921838

+0

@ user1921838:等待十分鐘。 – SLaks

0

改成這樣:

public void loadWorldAsReg() { 
    for (int x = 0; x < maxBlockX; x += 20) { 
     for (int y = 0; y < maxBlockY; y += 20) { 
     blocks[x][y] = new Block(); 
     blocks[x][y].draw(); 
    } 
    } 
} 

呼叫使用對象之前構造。假設你的代碼有一個,我使用了默認的構造函數Block()。包含參數(如果構造函數需要的話)。 :)

+0

謝謝Divyanshu! – user1921838

+0

嗯......當我試圖做你指定的代碼時,它只繪製一次,現在只要我想要它?! – user1921838

+0

沒有得到你。你認爲你需要一個[Java定時器](http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Timer.html)嗎? – Divyanshu

0

寫入Block[][] blocks = new Block[maxBlockX][maxBlockY]將創建一個大小爲maxBlockX * maxBlockY的二維數組,其中只包含空值。

新的DATA_TYPE [size1] [size2]將僅填充PRIMITIVE數據類型的默認值。所以新的int [2] [1]將創建一個數組[[0],[0]],新的Block [2] [1]將創建[[null],[null]]。

只需正確初始化您的塊,您將被設置。

Block[][] blocks = new Block[maxBlockX][maxBlockY]; 
for (int i=0; i<blocks.length; i++) 
    for (int j=0; j<blocks[0].length; j++) 
    blocks[i][j] = new Block(); 

您還可以通過檢查loadWorld函數來避免繪製不良(null)數據。這也可能會讓你的生活更輕鬆,不知道:

public void loadWorldAsReg() { 
    for (int x = 0; x < maxBlockX; x += 20) { 
    for (int y = 0; y < maxBlockY; y += 20) { 
     if (blocks[x][y] != null) 
     blocks[x][y].draw(); 
    } 
    } 
}