Java 2D游戏NullPointerException

时间:2015-11-04 18:54:18

标签: java

我正在尝试用Java创建一个2D游戏,提示用户输入行宽和列长。创建一个“世界”对象,打印时看起来像这样(其中P是玩家的角色):

P---
----
----
----

然后用户可以进入,向下,向左,向右或退出,这应该移动P并且如果移动将角色从地图上移开则不执行任何操作。我的问题是在输入宽度和长度后,我收到以下错误:

java.lang.NullPointerException
at World.displayWorld(Driver.java:90)
at Driver.main(Driver.java:28)

我相信这意味着Java将worldDimensions.length视为空/ null?我认为在创建世界对象时我正在为它赋值。任何指导都非常感谢!

这是我的代码:

import java.util.Scanner;

public class Driver {
    public static void main(String args[]) {

        //Create a scanner object
        Scanner input = new Scanner(System. in );

        boolean exit = true;

        //Prompt user to enter world width and height
        System.out.print("World width: ");
        int userWidth = input.nextInt();
        System.out.print("World height: ");
        int userHeight = input.nextInt();

        //Create a world object
        World world1 = new World(userWidth, userHeight);
        world1.displayWorld();

        System.out.println("Possible inputs: up, down, left, right, exit");

        while (exit = true) {
            //display world
            world1.displayWorld();

            System.out.print("ACTION > ");
            String userAction = input.next();

            if (userAction == "up" || userAction == "down" || userAction == "left" || userAction == "right" || userAction == "exit") {
                switch (userAction) {
                    case "up":
                        world1.moveUp();
                        break;
                    case "down":
                        world1.moveDown();
                        break;
                    case "left":
                        world1.moveLeft();
                        break;
                    case "right":
                        world1.moveRight();
                        break;
                    case "exit":
                        exit = false;
                        break;
                }
            } else {
                System.out.println("Invalid Input. Possible inputs are: up, down, left, right, or exit.");
            }
        }

    }
}

class World {
    static private char[][] worldDimensions;
    static private int characterRow;
    static private int characterColumn;

    public World(int userWidth, int userHeight) {
        char[][] worldDimensions = new char[userHeight][userWidth];
        int characterRow = 0;
        int characterColumn = 0;

        for (int row = 0; row < worldDimensions.length; row++) {
            for (int column = 0; column < worldDimensions[row].length; column++) {
                if (characterRow == row && characterColumn == column) {
                    worldDimensions[row][column] = (char)
                    'P';
                } else {
                    worldDimensions[row][column] = (char)
                    '-';
                }
            }
        }
    }

    public void displayWorld() {
        for (int row = 0; row < worldDimensions.length; row++) {
            for (int column = 0; column < worldDimensions[row].length; column++) {
                System.out.print(worldDimensions[row][column]);
            }
            System.out.println();
        }
    }

    public void moveUp() {
        if (characterRow - 1 >= 0) {
            characterRow--;
        }
    }

    public void moveDown() {
        if (characterRow + 1 <= worldDimensions[0].length) {
            characterRow++;
        }
    }

    public void moveLeft() {
        if (characterColumn - 1 >= 0) {
            characterColumn--;
        }
    }

    public void moveRight() {
        if (characterRow + 1 <= worldDimensions.length) {
            characterRow++;
        }
    }
}

2 个答案:

答案 0 :(得分:1)

你在构造函数中隐藏worldDimensions。本地声明不会提供与之前声明的字段相同的字段。

只需删除声明,您就可以了(至少对于该错误):

worldDimensions = new char[userHeight][userWidth];

答案 1 :(得分:1)

你正在覆盖你的类变量worldDimensions。您的World构造函数应如下所示

public World(int userWidth, int userHeight)
{
//here is where you were overwriting the global variable, leaving it null
//and populating the local one instead
worldDimensions = new char[userHeight][userWidth];
int characterRow = 0;
int characterColumn = 0;

for (int row = 0; row < worldDimensions.length; row++)
    {
    for (int column = 0; column < worldDimensions[row].length; column++)
        {
        if (characterRow == row && characterColumn == column)
            {
            worldDimensions[row][column] = (char)'P';
            }
        else
            {
            worldDimensions[row][column] = (char)'-';
            }
        }
    }
}