簡體   English   中英

如何在我的代碼中避免 java.lang.NullPointerException?

[英]How to avoid java.lang.NullPointerException in my Code?

我問了一個關於我的生命游戲實現代碼的問題。 建議的解決方案解決了我的問題,但創建了一個新問題。
現在,如果我嘗試調用getCell()方法,我會得到java.lang.NullPointerException 我怎樣才能避免這個異常?

使用我使用的相應代碼和解決方案代碼鏈接到我之前的問題: 如何在我的 getCell 方法中訪問單元陣列? (爪哇)

或者,如果您只想要代碼:

public class GameMap {
    private Cell[][] cellArray;
    
    private static Cell[][] buildCellArray(int width, int height){
        Cell[][] cellArray = new Cell[width][height];
        int i;
        int j;
        for(i = 0; i < width; i++) {
            for(j = 0; j < height; j++) {
                cellArray[i][j] = new Cell();
            }
        }
        return cellArray;
    }
    
    public GameMap(int sizeX, int sizeY) {
        buildCellArray(sizeX, sizeY);
    }
    
    
    public Cell getCell(int posX, int posY){
        return cellArray[posX][posY];
    }
}
buildCellArray(sizeX, sizeY);

這確實構建了一個新數組並返回它,但是您沒有將它分配給它需要 go 的那個字段。 您只是丟棄了結果,並且該字段保持原樣( null )。

你需要做

cellArray = buildCellArray(sizeX, sizeY);

您有一個與 static 方法中的字段同名的局部變量,這有點令人困惑。 但它們完全不相關。 盡量避免這種陰影。 您可以將名稱更改為例如

private static Cell[][] buildCellArray(int width, int height){
    Cell[][] newCellArray = new Cell[width][height];

就像 Thilo 提到的那樣,您當前返回您在方法中創建的新單元格數組,但您從未在 GameMap 中分配您的字段“cellArray”。 相反,您定義了一個具有相同名稱的新變量 cellArray,將所有關聯的值存儲在其中,返回它,然后不使用它。

有很多方法可以解決這個問題。 您可以這樣修改您的構造函數:

public GameMap(int sizeX, int sizeY) {
    this.cellArray = buildCellArray(sizeX, sizeY);
}

這將在您從 buildCellArray 返回后設置類的cellArray字段的值。

另一種方法是稍微更改您在buildCellArray方法中的cellArray聲明,並在您的方法定義中刪除 static 修飾符。 而不是說:

Cell[][] cellArray = new Cell[width][height];

你可以改為說:

cellArray = new Cell[width][height];

這會起作用,因為在您的第一個示例中,您正在創建一個全新的變量(具有相同的名稱,但在不同的范圍內)。 這意味着您在為它定義所有內容時不引用您的字段cellArray ,而只引用您在buildCellArray中創建的本地版本。 但是,在此示例中,您將使用原始字段作為參考,而不是變量的本地版本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM