我正在用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