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;
}

これは Vertex クラスです。

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 を配列に初期化しましたが、subGraph[i] を初期化しませんでした。

于 2013-04-30T08:47:28.520 に答える
1

ループ内に追加します。

subGraph[i] = new Vertex();

アクセスする前に、まずオブジェクトをインスタンス化する必要があります(subGraph[i]あなたの場合)。

于 2013-04-30T08:46:53.210 に答える
0

Java でオブジェクト配列を作成すると、null 値で自動的に初期化されます。配列をループして、新しいオブジェクトへの参照を設定するのはあなたの責任です。あなたの場合、頂点オブジェクトをすべての配列位置に割り当てる必要があります。

于 2013-04-30T08:47:38.080 に答える
0

追加時

subGraph[i] = new Vertex();

この行の前に

subGraph[i].nodeDelay = AdjList[i].nodeDelay;
于 2013-04-30T08:50:57.523 に答える
0

なぜならsubGraph[i]、最初はnull. null オブジェクトのフィールドにアクセスまたは変更しようとしているため、明らかにNullPointerExceptionsubGraph[i].nodeDelayがスローされますデフォルトでは、参照の配列は常に null 参照の要素で初期化されます。

于 2013-04-30T08:46:42.237 に答える
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 に答える