为什么我的对象不保留它们构造的数据?

时间:2014-04-23 15:56:15

标签: java android nullpointerexception adt logcat

我正在用Java构建一个Android应用程序来浏览校园中的三座建筑物。用户输入他们所在房间的房间号,以及他们希望前往的房间的房间号,并给出从一个房间到另一个房间的指示。

作为其中的一部分,我创建了一个WorldMap类来保存地图,并在其中定义了一堆用于寻路的节点。就我能说的而言,节点声明完全正常,但当我尝试从WorldMap类的方法中访问它们时,程序抛出了NullPointerException。我对此进行了调查,Eclipse告诉我每个节点都有一个节点。字段设置为空值。

虽然我并不是全新的Java,但我仍然相对较新,过去几乎完全使用过C ++,我完全不知道我在这里看到什么,也不知道从哪里开始寻找

然后是代码。

这是如何声明节点的示例:

Node g2 = new Node(
    new ConnectionTo[] {
        new ConnectionTo(new Node(new Coordinates()), new Room[]{}, Direction.north),
        new ConnectionTo(new Node(new Coordinates(0,3,8)), new Room[]{}, Direction.east),
        new ConnectionTo(new Node(new Coordinates(0,4,7)), new Room[]{}, Direction.south),
        new ConnectionTo(new Node(new Coordinates(0,3,6)), new Room[]{new Room("104",new String[]{"left","right"}),new Room("120",new String[]{"right","left"})}, Direction.west),
        new ConnectionTo(new Node(new Coordinates()), new Room[]{}, Direction.up),
        new ConnectionTo(new Node(new Coordinates()), new Room[]{}, Direction.down)
    },  new Coordinates(0,3,7)
);

这是节点的存储方式:

Node[][][] map =
{
    {   //first floor
        //00   01   02   03   04   05   06   07   08   09
        {dne, dne, dne, dne, dne, cls, dne, dne, dne, dne}, //00
        {dne, dne, dne, dne,  oc,  cl,  cf, dne, dne, dne}, //01
        {dne, dne, dne, dne, dne, dne, dne, dne, dne, dne}, //02
        {dne, dne, dne, dne, og2,  g4,  gc,  g2, gs1, dne}, //03
        {dne, dne, dne, dne, dne, dne, gs2,  g1,  g3, dne}, //04
        {dne, ot3, dne, ot1,  op, dne, og1, gal, dne, dne}, //05
        {dne, ot4, dne, dne, dne, dne,  a2,  a1, dne, dne}, //06
        {dne,  t3, dne, dne, dne, dne, dne,  a3,  as, dne}, //07
        {dne,  t1, tl1, ot2, dne, dne, dne,  a4, dne, dne}, //08
        { ts,  t2, tl2, ot5, dne, dne, dne, dne, dne, dne}, //09
        {dne,  t4, tls, dne, dne, dne, dne, dne, dne, dne}, //10
    },
    {   //second floor
        //00   01   02   03   04   05   06   07   08   09
        {dne, dne, dne, dne, dne, CLS, dne, dne, dne, dne}, //00
        {dne, dne, dne, dne, dne,  CL,  C2,  C4, dne, dne}, //01
        {dne, dne, dne, dne, dne,  C1,  C3,  C5, dne, dne}, //02
        {dne, dne, dne, dne, dne,  G4, GC1,  G3, GS1, dne}, //03
        {dne, dne, dne, dne, dne, GC2, dne,  G1,  G2, dne}, //04
        {dne, dne, dne, dne, dne, GS2, dne, GAL, dne, dne}, //05
        {dne, dne, dne, dne, dne, dne,  A5,GALS, dne, dne}, //06
        {dne, dne, dne, dne, dne, dne,  A3,  A1, dne, dne}, //07
        {dne, dne, dne, dne, dne, dne, dne,  A2,  AS, dne}, //08
        { TS,  T4,  T3, dne, dne, dne, dne, dne, dne, dne}, //09
        {dne, TLS,  TL, dne, dne, dne, dne, dne, dne, dne}, //10
    }
};

这是" dne"节点:static Node dne = new Node();

Node.java的相关部分:

public class Node
{
    ConnectionTo n, e, s, w, u, d;
    ConnectionTo[] dirArr;
    boolean[] hasConnection;
    Coordinates coords;
    boolean exists;
    Coordinates targetCoordsHolder;

    Node () { exists = false; }
    Node (ConnectionTo[] connections, Coordinates location)
    {
        hasConnection = new boolean[6];
        exists = true;
        n = connections[0];
        e = connections[1];
        s = connections[2];
        w = connections[3];
        u = connections[4];
        d = connections[5];
        dirArr = connections;
        coords = location;
        for (int i = 0; i < dirArr.length; i++)
        {
            hasConnection[i] = false;
            if (dirArr[i].exists) { hasConnection[i] = true; }
        }
        if (location.equals(new Coordinates()))
        {
            exists = false;
        }
    }
}

ConnectionTo.java的相关部分:

public class ConnectionTo
{
    Direction dir;
    Room[] rooms;
    Node targetNode;
    boolean exists = true;
    double cost;
    public ConnectionTo (Node target, Room[] rms, Direction pdir, double cost)
    {
        if (target.coords.equals(new Coordinates())) { exists = false; }
        if (!target.exists)
        {
            exists = false;
            return;
        }
        targetNode = target;
        rooms = rms;
        dir = pdir;
        this.cost = cost;
    }
    public ConnectionTo() { exists = false; }
    public ConnectionTo (Direction pdir)
    {
        this(new Node(), new Room[]{}, pdir, 256);
    }
    public ConnectionTo (Node target, Room[] rms, Direction pdir)
    {
        this (target, rms, pdir, 256);
    }
}

Room.java的相关部分:

public class Room
{
    String name;
    int num;
    boolean nonstandardMsg;
    String[] msgs;

    Room (String roomName, int roomNum, String[] approachMsgs)
    {
        this(roomName, roomNum, approachMsgs, false);
    }
    Room (String roomName, int roomNum, String[] approachMsgs, boolean nsp)
    {
        name = roomName;
        num = roomNum;
        msgs = approachMsgs;
        nonstandardMsg = nsp;
    }
    Room (String roomName, String[] approachMsgs)
    {
        this(roomName, approachMsgs, false);
    }
    Room (String roomName, String[] approachMsgs, boolean nsp)
    {
        name = roomName;
        //if first character is a number
        if (roomName.charAt(0) == '1' || roomName.charAt(0) == '2' || roomName.charAt(0) == '3' || roomName.charAt(0) == '4' || roomName.charAt(0) == '5' || roomName.charAt(0) == '6' || roomName.charAt(0) == '7' || roomName.charAt(0) == '8' || roomName.charAt(0) == '9' || roomName.charAt(0) == '0')
        {
            //if last character is number
            if (roomName.charAt(roomName.length()-1) == '1' || roomName.charAt(roomName.length()-1) == '2' || roomName.charAt(roomName.length()-1) == '3' || roomName.charAt(roomName.length()-1) == '4' || roomName.charAt(roomName.length()-1) == '5' || roomName.charAt(roomName.length()-1) == '6' || roomName.charAt(roomName.length()-1) == '7' || roomName.charAt(roomName.length()-1) == '8' || roomName.charAt(roomName.length()-1) == '9' || roomName.charAt(roomName.length()-1) == '0')
            {
                num = Integer.parseInt(roomName);
            }
            else
            {
                num = Integer.parseInt(roomName.substring(0, roomName.length() - 2));
            }
        }
        else
        {
            num = Integer.parseInt(roomName.substring(1));
        }
        msgs = approachMsgs;
        nonstandardMsg = nsp;
    }
}

编辑:忘了提 - 我正在使用ADT为Android 4.3构建这个,包括内置的模拟器和调试器。

编辑2:由于WorldMap.java文件的长度接近900行,我已在此链接上将其放在Pastebin上:http://pastebin.com/zcaxuSCt

0 个答案:

没有答案
相关问题