访问数组成员时抛出NullPointerException

时间:2011-11-16 02:01:50

标签: java arrays nullpointerexception

我遇到一个异常问题,每次尝试执行以下代码时都会抛出异常。

下面是驱动程序,下面我将为您提供RoomplayerEnters方法的构造函数。

import java.util.Random;
import java.util.Scanner;

public class ZorkPlayer
{

    public static void main (String [ ] args)
    {
        // create a start screen followed by introduction
        int choice = 0;
        while(choice != 3)
        {
            choice = menu();
            switch (choice)
            {
                case 1:
                    //begin new game
                    newGame();
                    break;
                case 2:
                    //change difficulty level
                    break;
                case 3:
                    //exit the program
                    break;
                default: 
                    //invalid choice
                    break;
            }
        }
    }

    /**
     * Creates a menu and gets a choice from the user <br>        
     */
    public static int menu ()
    {
        Scanner kb = new Scanner(System.in);
        System.out.println("Welcome to Zork!");
        System.out.println("What would you like to do?");
        System.out.println("\t1- Start a new game");
        System.out.println("\t2- Choose difficulty level (not yet available)");
        System.out.println("\t3- Exit the program");
        int choice = kb.nextInt();
        return choice;
    }

    public static void newGame()
    {
        final int DEFAULT_ROOMS = 5;
        Random rng = new Random ();
        int numRooms = rng.nextInt(5) + DEFAULT_ROOMS;
        int playerPos = 0;
        Room dungeon[] = new Room[numRooms];

        dungeon[playerPos].playerEnters();
        for (int i = 0; i < dungeon.length; i++)
        {
            System.out.print (dungeon[i].getMap ( ));
        }
    }
}

会议室的构造函数

private int monster = 0; //initializes with no monster spawned
private int player = 0; //initializes with no player present
private int weapon = 0; //initializes with no weapon present

public Room()
{
    //creates a new room and determines whether the new room has a monster or not
    Random rng = new Random();
    int monsterSpawn = rng.nextInt (2); //determines whether or not a monster will spawn in the room
    if (monsterSpawn == 0)
    {
        new Monster(); //if a monster is spawned, creates a new monster and sets the value of monster to present
        setMonster(1);  
    }
    else
        setMonster(0); //otherwise leaves the value of monster to default
    setPlayer(0); //sets the presence of player to false
    setWeapon(0); //sets the presence of weapon to false
}

playerEnters方法

public void playerEnters()
{
    setPlayer(1);
}

只要在驱动程序中调用NullPointerException方法,就会抛出playerEnters,然后在调用getMap方法时再次抛出。{/ p>

2 个答案:

答案 0 :(得分:3)

忽略其他一切,这就是问题所在:

Room dungeon[] = new Room[numRooms];
dungeon[playerPos].playerEnters();

您创建了一个Room数组,但不在该数组中创建任何Room个对象。因此dungeon[playerPos]null

您需要使用Room个对象填充该数组。

for (int i = 0; i < numRooms; i++)
{
    dungeon[i] = new Room();
}

答案 1 :(得分:1)

您需要实例化房间。

 Room dungeon[] = new Room[numRooms];
 dungeon[0]=new Room();
 ...