0

这是我的代码: http: //pastebin.com/umy0FPvB(LG)

这是老师的代码: http: //pastebin.com/y5wU0Zpx (LCI)

当 LCI 试图从 LG [world()] 传递的矩阵中读取时,它告诉我老师代码的第 41 行我错了。

我已经坐了一段时间,但我似乎无法弄清楚出了什么问题。

Exception in thread "main" java.lang.NullPointerException
    at Console.printWorld(Console.java:41)
    at Console.playLife(Console.java:56)
    at Console.main(Console.java:30)

--

/**
 * The Life game
 * @author Noah Kissinger
 * @date 2012.2.13
 */

import java.util.Random;

public class Life {

    private static boolean[][] matrix;
    private static int bL, bH, lL, lH, r, c;
    private static long rSeed;

    public Life(long seed, int rows, int columns, int birthLow, int birthHigh,
            int liveLow, int liveHigh) {

        rSeed = seed;
        bL = birthLow;
        bH = birthHigh;
        lL = liveLow;
        lH = liveHigh;
        r = rows;
        c = columns;

        createMatrix();

    }

    public void update() {
        updateMatrix();
    }

    public boolean[][] world() {
        return matrix;
    }

    public static void createMatrix() {

        Random seedBool = new Random(rSeed);

        boolean[][] matrix = new boolean[r][c];

        for (int i = 0; i < matrix.length; i++) {
            for (int j = 0; j < matrix[i].length; j++) {
                matrix[i][j] = false;
            }
        }

        for (int i = 1; i < matrix.length - 1; i++) {
            for (int j = 1; j < matrix[i].length - 1; j++) {
                matrix[i][j] = seedBool.nextBoolean();
            }
        }

    }

    public static void updateMatrix() {

        Random seedBool = new Random(rSeed);

        boolean[][] matrixCopy = matrix.clone();
        for (int i = 0; i < matrix.length; i++)
            matrixCopy[i] = matrix[i].clone();

        int count = 0;

        for (int i = 1; i < matrix.length - 1; i++) {
            for (int j = 1; j < matrix[i].length - 1; j++) {

                if (matrix[i][j] == false) {

                    if (matrixCopy[i - 1][j - 1] == true)
                        count++;
                    if (matrixCopy[i - 1][j] == true)
                        count++;
                    if (matrixCopy[i - 1][j + 1] == true)
                        count++;
                    if (matrixCopy[i][j - 1] == true)
                        count++;
                    if (matrixCopy[i][j + 1] == true)
                        count++;
                    if (matrixCopy[i + 1][j - 1] == true)
                        count++;
                    if (matrixCopy[i + 1][j] == true)
                        count++;
                    if (matrixCopy[i + 1][j + 1] == true)
                        count++;

                    if (count >= bL && count <= bH) {
                        matrix[i][j] = true;

                        for (int i1 = 0; i1 < matrix.length; i1++) {
                            for (int j1 = 0; j1 < matrix[i1].length; j1++) {
                                matrix[i1][j1] = false;
                            }
                        }

                        for (int i1 = 1; i1 < matrix.length - 1; i1++) {
                            for (int j1 = 1; j1 < matrix[i1].length - 1; j1++) {
                                matrix[i1][j1] = seedBool.nextBoolean();
                            }
                        }
                    } else
                        matrix[i][j] = false;
                    count = 0;

                }

                else {

                    if (matrixCopy[i - 1][j - 1] == true)
                        count++;
                    if (matrixCopy[i - 1][j] == true)
                        count++;
                    if (matrixCopy[i - 1][j + 1] == true)
                        count++;
                    if (matrixCopy[i][j - 1] == true)
                        count++;
                    if (matrixCopy[i][j + 1] == true)
                        count++;
                    if (matrixCopy[i + 1][j - 1] == true)
                        count++;
                    if (matrixCopy[i + 1][j] == true)
                        count++;
                    if (matrixCopy[i + 1][j + 1] == true)
                        count++;

                    if (count >= lL && count <= lH)
                        matrix[i][j] = true;
                    else
                        matrix[i][j] = false;
                    count = 0;

                }
            }
        }
    }
}

--

/**
 * The Console class is a console interface to the Life game.
 * @author DH
 * @date Sept. 2008
 */

import java.util.Scanner;


public class Console {

    /**
     * @param args unused
     */
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        System.out.println("Please enter the size of the matrix(rows, columns) :");
        int rows = in.nextInt();
        int columns = in.nextInt();
        System.out.println("Please enter random seed: ");
        long seed = in.nextLong();
        System.out.println("Please enter birth range (low, high) :");
        int birthLow = in.nextInt();
        int birthHigh = in.nextInt();
        System.out.println("Please enter live range (low, high): ");
        int liveLow = in.nextInt();
        int liveHigh = in.nextInt();
        try {
            Life game = new Life(seed, rows, columns, birthLow, birthHigh, liveLow, liveHigh);
            playLife(game);
        } catch (IllegalArgumentException e) {
            System.out.println("Inappropriate values: " + e.getMessage());
        }
    }

    /**
     * Print a boolean matrix
     * @param world is a boolean matrix to be printed with # for true and - for false.
     */
    public static void printWorld(boolean[][] matrix) {
        for (int r=0; r<matrix.length; r++) {
            for (int c=0; c<matrix[0].length; c++) {
                System.out.print(matrix[r][c] ? " # " : " - ");
            }
            System.out.println();
        }
        System.out.println();

    }

    /**
     * Play the game of Life starting with a given state
     * @param game is the Life object that provides the current state of Life
     */
    public static void playLife(Life game) {
        printWorld(game.world());
        for (int i=0; i<10; i++) {
            game.update();
            printWorld(game.world());
        }
    }

}
4

2 回答 2

3

这是你的问题。在您的方法中,当您真正想要修改字段时,createMatrix()您定义了一个局部变量。matrixmatrix

您可能会发现使用 访问字段很有用this,例如this.matrix。它在代码中做出了明确的区分。但是,大多数 IDE 会自动突出显示字段和局部变量,因此有些人认为没有必要,这是样式问题,并不太重要。

我还没有检查你程序的其余部分,可能还有其他错误。

   public static void createMatrix() {

    Random seedBool = new Random(rSeed);

    this.matrix = new boolean[r][c];

    for (int i = 0; i < this.matrix.length; i++) {
        for (int j = 0; j < this.matrix[i].length; j++) {
            this.matrix[i][j] = false;
        }
    }

    for (int i = 1; i < this.matrix.length - 1; i++) {
        for (int j = 1; j < this.matrix[i].length - 1; j++) {
            this.matrix[i][j] = seedBool.nextBoolean();
        }
    }

}
于 2012-02-13T17:31:18.327 回答
1

boolean[][] matrix = new boolean[r][c];

这一行创建了一个二维布尔数组,并将其存储在方法中的一个loca 变量createMatrix。所以,matrixLife 类中的静态字段仍然是null. 该字段被读取并通过world方法传递到playLife方法中。并且,接下来是printLife方法触发NPE的调用。

顺便说一句,您为什么使用许多静态字段和方法来实现生命游戏?

于 2012-02-13T17:41:18.227 回答