0

代码块如下所示:

public static Vertex[] computeSubGraph(Vertex[] AdjList, int[] retiming)
{
    Vertex[] subGraph = new Vertex[AdjList.length];
    for (int i = 0; i < AdjList.length; i++) {
        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;
}

这是顶点类:

public class Vertex implements Comparable<Vertex> {
    public int arcWeight;               
    public int preDelay;                
    public boolean infinite = true;
    public int nodeDelay = 0;
    public Vertex predecessor = null;
    public ArcNode firstArc = null;
    public int mark = 0;
    public int starTime;    
    public int finishTime;
    public ArrayList<ArcNode> inArcList = new ArrayList<ArcNode>();
    public ArrayList<ArcNode> outArcList = new ArrayList<ArcNode>();
}

实际上,我只想将 AdjList 中的元素复制一个新的数组subgraph中。但错误信息显示“java.lang.NullPointerException”并显示问题出在“subGraph[i].nodeDelay = AdjList[i].nodeDelay;” 线。

我通过打印到控制台进行了测试。发现 AdjList.length 为 8,问题出现在第一轮;即使我只写“subGraph[i].nodeDelay;” 如果不为其分配任何值,它也会显示错误消息。对此有任何想法吗?提前致谢。

4

6 回答 6

1

将其添加到循环中:

subGraph[i] = new Vertex();

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

于 2013-04-30T08:46:53.210 回答
1

答案是:未初始化的变量。您确实将 subGraph 初始化为一个数组,但您没有初始化 subGraph[i]。

于 2013-04-30T08:47:28.520 回答
0

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

于 2013-04-30T08:46:42.237 回答
0

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

于 2013-04-30T08:47:38.080 回答
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;
}
于 2013-04-30T08:49:29.643 回答
0

添加时

subGraph[i] = new Vertex();

在这条线之前

subGraph[i].nodeDelay = AdjList[i].nodeDelay;
于 2013-04-30T08:50:57.523 回答