2010-04-13 137 views
0

我有一個類「Tetris」,其中一個實例變量是「board」。 「board」是Color對象的二維數組。創建一個俄羅斯方塊對象時,我調用一個方法來設置棋盤的尺寸,然後將所有顏色對象設置爲默認值,即Color.blue。二維數組上的空指針異常(Java)

public Tetris(int rows, int cols) { 
    this.rows = rows; 
    this.cols = cols; 
    reset(rows, cols); 
} 

public void reset(int rows, int cols) { 
    Color[][] board = new Color[rows][cols]; 
    for(int i = 0; i<this.rows; i++) { 
    for(int j = 0; j<this.cols; j++) { 
     board[i][j] = DEFAULT_COLOR; // Color.blue; //DEFAULT-COLOR 
    } 
    } 
} 

不幸的是,當我運行的代碼(這顯然尚未發佈的全部),我上線一個空指針異常:

board[i][j] = DEFAULT_COLOR; // Color.blue; //DEFAULT-COLOR. 

有什麼明顯錯誤與我我在做什麼?

+0

與NPE無關,但在重置時,您應該傳入行/列或使用this.rows/this.cols,但不能同時使用。此外,Color []是在本地創建的,不會返回或設置爲實例字段。 – Thilo 2010-04-13 06:34:46

+0

你有一個名爲board的班級成員嗎?如果是這樣,你的重置函數,正如喬恩所說的,不會初始化那個成員,因爲你的局部變量板覆蓋了從未初始化的類成員。 – Ernelli 2010-04-13 06:46:45

回答

-2

我想你必須分配這樣的那些顏色的每一個: 板[i] [j] =新的色彩(...

+0

沒有必要這麼做 - 使用DEFAULT_COLOR將意味着每個數組元素引用同一個對象。特別是,這不會在賦值中導致NullPointerException。 – 2010-04-13 06:36:12

2

這將幫助,如果你發佈簡短而完整的程序這表明了你的問題,你發佈的代碼不足以拋出異常,但我可以看到如何進行一些修改。

特別是,在你的reset方法中新的局部變量...而你的也有有一個實例變量board?我懷疑的解決方案可能是爲改變reset開始時一樣簡單:

board = new Color[rows][cols]; 

如果你真正的代碼使用本地變量來創建磁盤陣列,但隨後試圖通過實例變量賦值,這很可能很好是問題的原因。

它也似乎不對您傳遞rowscols到方法,並使用在一個地方這些參數,但實例變量this.rows和循環this.cols。爲什麼麻煩通過他們呢?