Java nullPointerException при заполнении объекта Hierarchy с помощью saxParser

1

Я заполняю массив комнат с предметами и существами комнаты в их соответствующие комнаты из XML файла, используя saxParser.

У меня возникли проблемы с выяснением того, почему я, кажется, теряю все в массиве, когда я оставляю свои условные утверждения в моем переопределенном методе startElement. У меня есть два оператора печати, один внутри внизу условных выражений, а другой за пределами условных выражений, чтобы проверить, все ли в массиве в определенных местах. Заявление внутри условных выражений выводит правильное имя комнаты в комнатах [0], которое является "Violet", а оператор за пределами условных выражений дает мне исключение nullPointerException и моя программа вылетает из строя.

Я чувствую, что я не устанавливаю массив в конце, где должен, но я не могу поймать свою ошибку. Я очень ценю любую помощь, которую я могу получить.

Вот мой класс и метод startElement:

    public class MyHandler extends DefaultHandler {

        private Room current;
        private PC player;
        private Room[] rooms = new Room[10];

        @Override
        public void startElement(String discard1, String discard2, String tagname, Attributes attr) {

            if (tagname.equals("room")) {
                for (int j = 0; j < rooms.length; j++) {
                    if (rooms[j] == null) {
                        current = rooms[j] = new Room(attr.getValue("name"), attr.getValue("description"), attr.getValue("state"), new Room(attr.getValue("north")), new Room(attr.getValue("south")), new Room(attr.getValue("east")), new Room(attr.getValue("west")));
                        break;
                    }
                }
                // System.out.println(current);
            } else if (tagname.equals("animal")) {
                current.addCreature(new Animal(current, attr.getValue("name"), attr.getValue("description")));
                //  System.out.println(current);
            } else if (tagname.equals("NPC")) {
                current.addCreature(new NPC(current, attr.getValue("name"), attr.getValue("description")));
                //  System.out.println(current);
            } else if (tagname.equals("PC")) {
                //this means the tag is the PC
                player = new PC(current, attr.getValue("name"), attr.getValue("description"), 40);
                current.addCreature(player);
                 System.out.println(rooms[0].getRoomName());
            }
             System.out.println(rooms[0].getRoomName());
        }}

Вот мой класс комнаты:

public class Room {

   private String state;
   private String roomScript;
   private String roomName;
   private Creature[] creatures = new Creature[10];
   private int top = 0;
   private Room north;
   private Room south;
   private Room east;
   private Room west;

        public Room(String r, String s, String rS, Room n, Room so, Room e, Room w) {
            roomName = r;
            roomScript = rS;
            state = s;
            north = n;
            south = so;
            east = e;
            west = w;       
        }

        public Room(String n){
            roomName = n;
        }

        public String getState(){
            return state;
        }

        public void changeState(String s){
            state = s;
        }

        public String getRoomName(){
            return roomName;
        }

        public void addCreature(Creature a) {

            if (top >= 10) {
                System.out.println("This room is full.");

            } else {
                creatures[top] = a;
                top++;

            }
        }
        public void removeCreature(Creature a){
            for (int i = 0; i < creatures.length; i++) {
                if (creatures[i] == null){
                    System.out.println("Nobody is home");
                } else if (creatures[i].equals(a)){
                    creatures[i] = null;
                }
            }
        }

        public void notifyCreatures(Room r){
            for (int i = 0; i < creatures.length ; i++) {         
                    creatures[i].react();
            }

        }




        public String toString() {
            if (top == 0) {
                return roomName + ", contains: nothing";
            }
            String temp = "";
            for (int i = 0; i < top; i++) {

                temp = temp + " " + creatures[i].toString();

            }
            return roomName + ": " + roomScript + " is: " + state + ". Neighbors are: " + north.getRoomName() + ", " + south.getRoomName() + ", " + east.getRoomName() + ", " + west.getRoomName() + ". It contains: " + temp;
        }


    }

И вот образец моего входного файла:

<xml version="1.0" encoding="UTF-8">
    <room name="Violet" description="a large round room with violet draperies"
        state="half-dirty" north="Pig" east="Student" south="Teacher" west="Green">
        <animal name="Peter" description="a brown dog" />
        <animal name="Lily" description="a black and white cat" />
        <NPC name="Mary" description="a tall woman" />
        <PC name="Squash" description="one who doesn't leave the animals and NPC-s alone" />
    </room>
    <room name="Pig" description="this one used to be a pigsty, now a guestroom"
        state="clean" north="Roofless" south="Violet" west="Windy">
        <animal name="Lucy" description="a pink pig" />
        <animal name="Mutsu" description="a black-spotted pig" />
    </room>
    <room name="Student" description="the pigs don't like to come here"
        state="dirty" south="Snowy" west="Violet">
        <NPC name="Jeremy"
            description="a student who writes Java projects in the very last moment" />
        <NPC name="Martina" description="a student who doesn't write Java projects at all" />
        <NPC name="Lewell" description="a student who doesn't even know what a Java project is" />
        <NPC name="Ema" description="a student who always writes Java projects on time" />
    </room>
    <room name="Teacher" description="the pigs don't like to come here either"
        state="dirty" north="Violet" east="Snowy" west="Drafty">
        <NPC name="Pencho" description="students always fall asleep in his class" />
        <NPC name="Divachka" description="a teacher who falls asleep in her own classes" />
    </room>
    <room name="Green" description="there is grass growing on the floor"
        state="half-dirty" north="Windy" east="Violet" south="Drafty">
        <NPC name="Robot" description="made of tin" />
        <NPC name="AI" description="made of intelligent parts" />
        <animal name="Savage" description="a chihuahua" />
        <animal name="Fluffy" description="a rottweiler" />
    </room>
    <room name="Roofless"
        description="it was not designed like this, but both teachers and students are too lazy to repair"
        state="half-dirty" east="Basement" south="Pig">
        <NPC name="Programmer" description="this one knows how to write Java projects" />
        <animal name="Meow" description="this animal is an old hairy lion" />
    </room>
    <room name="Basement" description="there is mold on the walls"
        state="half-dirty" west="Roofless">
        <animal name="Roddy" description="a big rat who has his own hole in the basement" />
        <NPC name="Moldy" description="likes to sleep in the basement" />
    </room>
    <room name="Windy" description="the windows are not insulated properly"
        state="dirty" east="Pig" south="Green">
        <NPC name="Maggie" description="likes animals" />
        <NPC name="Carrie" description="likes messy rooms" />
    </room>
    <room name="Drafty" description="someone needs to patch that wall"
        state="clean" north="Green" east="Teacher">
        <animal name="Milka" description="a violet cow" />
        <animal name="Marko" description="a gray donkey" />
        <animal name="Moo" description="a jersey cow" />
    </room>
    <room name="Snowy"
        description="this one is inaccessible November-March if you don't have a shovel"
        state="clean" north="Student" west="Teacher">
        <animal name="Polly" description="a polar bear" />
        <animal name="Pen" description="a penguin" />
    </room>
</xml>
Теги:
arrays
nullpointerexception
saxparser
object-construction

1 ответ

0

Если tagname не является room тогда даже первый элемент не будет заполнен.

Этот код также выглядит странно

current = rooms[j] = new Room(attr.getValue("name"), attr.getValue("description"),
  attr.getValue("state"), new Room(attr.getValue("north")), 
  new Room(attr.getValue("south")), new Room(attr.getValue("east")), 
  new Room(attr.getValue("west")));
  • 0
    то, что я пытаюсь сделать здесь, это то, что я создаю новую комнату и получаю параметры для комнаты из XML-файла, который я анализирую, затем назначаю его текущей точке в комнатах массива [j], затем обновляю мой указатель комнаты на текущая комната, которая является "текущей"

Ещё вопросы

Сообщество Overcoder
Наверх
Меню