2013-04-30 46 views
0

的代码块列出如下子图。但错误消息显示“java.lang.NullPointerException”并显示问题在于“subGraph [i] .nodeDelay = AdjList [i] .nodeDelay;”线。Java数组的NullPointerException

我通过打印到控制台进行测试。并发现AdjList.length是8,问题发生在第一轮;甚至当我只写“subGraph [i] .nodeDelay;”没有分配任何值,它也显示错误的信息。 对此有何想法?提前致谢。

+0

尝试打印AdjList – 2013-04-30 08:46:35

回答

1

添加它的循环中:

subGraph[i] = new Vertex(); 

首先,您需要访问它之前实例化一个对象(subGraph[i]你的情况)。

0

因为subGraph[i]最初是null。所以subGraph[i].nodeDelay显然会抛出一个NullPointerException,因为你试图来访问或修改空对象的字段。默认情况下,引用数组将始终使用空引用元素进行初始化。

1

答案是:未初始化的变量。你做初始化子图是一个数组,但你没有初始化subGraph [i]。

0

当你在java中创建一个对象数组时,它会自动初始化为空值。你有责任在数组上循环并使用新对象的引用来填充数组。 在你的情况下,你应该将Vertex对象分配给所有阵列位置。

0

您需要创建一个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; 
} 
0

在在马托computeSubGraph的开头添加

subGraph[i] = new Vertex(); 

此行之前

subGraph[i].nodeDelay = AdjList[i].nodeDelay;