2011-11-16 12 views
1

次のコードを実行しようとするたびに例外がスローされ続けるという問題が発生しています。配列メンバーにアクセスするたびにNullPointerExceptionがスローされる

以下はドライバであり、その下にRoomplayerEntersメソッドのコンストラクタがあります。 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); 
} 

ため

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 ()); 
     } 
    } 
} 

コンストラクタはNullPointerExceptionは再びplayerEnters方法が運転者に呼び出されるたびにスローされ、以下同様です。あなたはRoom配列を作成するのではなく、そのアレイ内の任意のRoomオブジェクトを作成しない

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

+0

コードフォーマットが少し壊れているようです。また、 'setPlayer'のコードはありますか? – slugonamission

+0

NPEは通常、非常に簡単にデバッグできます。デバッガでコードをステップ実行しましたか? –

+0

ちょっとCaleb、あなたはあなたのsscceから個人情報を削除したいかもしれません。 :D – mre

答えて

3

は、他のすべてを無視して、これは問題です。したがってdungeon[playerPos]nullです。

Roomオブジェクトで配列を設定する必要があります。

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

ありがとう、これは私の問題を修正しました。 – user1048778

1

あなたは部屋をインスタンス化する必要があります。

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

ありがとうございます、これも同様に動作します。 =) – user1048778

関連する問題