簡體   English   中英

Java Graph實現:nullpointerexception

[英]Java Graph Implementation: nullpointerexception

我正在嘗試使用arrayListarrayList在Java中實現圖形。

每當調用addEdge函數時,我都會不斷收到NullPointerException 我似乎不知道為什么。

這是我的代碼:

import java.util.ArrayList;

public class Graph {

    private static ArrayList<ArrayList<Integer>> adjList;

    public Graph(int vertices){
        ArrayList<ArrayList<Integer>> adjList = new ArrayList<ArrayList<Integer>>();
        for(int i = 0; i < vertices; i++){
            adjList.add(new ArrayList<Integer>());
        }
    }

    public void addEdge(int source, int destination){
        adjList.get(source).add(destination);
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Graph g = new Graph(4);
        g.addEdge(0, 1);
        g.addEdge(0, 2);
        g.addEdge(1, 2);
        g.addEdge(2, 0);
        g.addEdge(2, 3);
        g.addEdge(3, 3);

        System.out.println("Neighbors of vertex 0: " + adjList.get(0));
        System.out.println("Neighbors of vertex 2: " + adjList.get(2));
    }
}

請告知。

Graph構造函數中,您不是要初始化static成員adjList ,而是要定義一個具有相同名稱的本地成員。 另外,不需要adjListstatic ,因為它將在Graph所有實例之間共享。

將其調整為:

private ArrayList<ArrayList<Integer>> adjList;

public Graph(int vertices){
    adjList = new ArrayList<ArrayList<Integer>>();
    ...
}

您應該在adjList字段聲明中刪除static

此修飾符使adjList成為引用null的靜態實例。 並且在構造函數中,您實例化了另一個adjList值,該adjList對於您的構造函數是本地的(並且在構造函數被調用后,有待GC收集)。 這是兩個完全不同的變量,具有相同的名稱

更改構造函數,以便不聲明局部adjList變量

public Graph(int vertices){
    adjList = new ArrayList<ArrayList<Integer>>();
    for(int i = 0; i < vertices; i++){
        adjList.add(new ArrayList<Integer>());
    }

}

還要使此adjList變量為非靜態,因為您希望adjList對於每個圖都是唯一的,並且不要在所有圖之間共享

private ArrayList<ArrayList<Integer>> adjList;

在Graph構造函數中,您聲明adjList變量,該變量與您的靜態類沖突。 你應該更換

public Graph(int vertices){
        ArrayList<ArrayList<Integer>> adjList = new ArrayList<ArrayList<Integer>>();
        for(int i = 0; i < vertices; i++){
            adjList.add(new ArrayList<Integer>());
        }

    }

通過

public Graph(int vertices){
        adjList = new ArrayList<ArrayList<Integer>>();
        for(int i = 0; i < vertices; i++){
            adjList.add(new ArrayList<Integer>());
        }

    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM