的代码块列出如下子图。但错误消息显示“java.lang.NullPointerException”并显示问题在于“subGraph [i] .nodeDelay = AdjList [i] .nodeDelay;”线。Java数组的NullPointerException
我通过打印到控制台进行测试。并发现AdjList.length是8,问题发生在第一轮;甚至当我只写“subGraph [i] .nodeDelay;”没有分配任何值,它也显示错误的信息。 对此有何想法?提前致谢。
的代码块列出如下子图。但错误消息显示“java.lang.NullPointerException”并显示问题在于“subGraph [i] .nodeDelay = AdjList [i] .nodeDelay;”线。Java数组的NullPointerException
我通过打印到控制台进行测试。并发现AdjList.length是8,问题发生在第一轮;甚至当我只写“subGraph [i] .nodeDelay;”没有分配任何值,它也显示错误的信息。 对此有何想法?提前致谢。
添加它的循环中:
subGraph[i] = new Vertex();
首先,您需要访问它之前实例化一个对象(subGraph[i]
你的情况)。
因为subGraph[i]
最初是null
。所以subGraph[i].nodeDelay
显然会抛出一个NullPointerException,因为你试图来访问或修改空对象的字段。默认情况下,引用数组将始终使用空引用元素进行初始化。
答案是:未初始化的变量。你做初始化子图是一个数组,但你没有初始化subGraph [i]。
当你在java中创建一个对象数组时,它会自动初始化为空值。你有责任在数组上循环并使用新对象的引用来填充数组。 在你的情况下,你应该将Vertex对象分配给所有阵列位置。
您需要创建一个Vertex
实例,并在设置任何字段之前将其放入数组中。
喜欢的东西:
public static Vertex[] computeSubGraph(Vertex[] AdjList, int[] retiming)
{
Vertex[] subGraph = new Vertex[AdjList.length];
for (int i = 0; i < AdjList.length; i++) {
subGraph[i] = new Vertex(); // adding instance prior to setting fields.
System.out.println(i);
subGraph[i].nodeDelay = AdjList[i].nodeDelay;
subGraph[i].predecessor = AdjList[i].predecessor;
subGraph[i].mark = AdjList[i].mark;
subGraph[i].starTime = AdjList[i].starTime;
subGraph[i].finishTime = AdjList[i].finishTime;
for (int j = 0; j < AdjList[i].inArcList.size(); j++) {
ArcNode old = AdjList[i].inArcList.get(j);
ArcNode newNode = new ArcNode(old.adjVex, old.arcWeight);
subGraph[i].outArcList.add(newNode);
subGraph[old.adjVex].inArcList.add(newNode);
}
}
return subGraph;
}
在在马托computeSubGraph的开头添加
subGraph[i] = new Vertex();
此行之前
subGraph[i].nodeDelay = AdjList[i].nodeDelay;
尝试打印AdjList – 2013-04-30 08:46:35