-2

ここに関連する投稿がたくさん見つかりましたが、答えが得られませんでした。なぜこの実行時エラーが発生するのですか?

static List<Integer>[] adj = (List<Integer>[]) new ArrayList[1000];

    public static void main(String[] args) {
        int edge, u, v, source;
        Scanner input = new Scanner(System.in);
        edge = input.nextInt();
        for (int i = 0; i < edge; i++) {
            u = input.nextInt();
            v = input.nextInt();
            adj[v].add(u); // Null pointer Exception
            adj[u].add(v); // Null pointer Exception
        }
4

4 に答える 4

3

まず、配列の各要素を初期化する必要があります。これを行うまで、配列内の参照はオブジェクトを指していないためです。

したがって、その for ループの前に、これを追加してList内部を初期化できますArray: -

for (List<Integer> elem: adj) {
    elem = new ArrayList<Integer>();
}

List of Listまた、よりも持っている方が良いでしょうarray of List。したがって、リストを次のように宣言できます。

static List<List<Integer>> adj = new ArrayList<List<Integer>>();

を使用する利点はArrayList、最初からサイズを制限する必要がないことです。したがって、要素をいくつでも追加できます。ただし、固定サイズのリストを作成する必要がある場合は、ArrayListコンストラクターでサイズ パラメーターを渡すことができます。

そして、要素を追加するコードを次のように変更する必要があります: -

adj[v].add(u);

に: -

adj.get(v).add(u);
于 2012-10-24T18:59:52.607 に答える
2

それは、割り当てないからですadj[v]addでメソッドを呼び出すことはできませんnull

あなたができる

   for (int i = 0; i < edge; i++) {
        u = input.nextInt();
        v = input.nextInt();
        if (adj[v]==null) adj[v] = new ArrayList();
        adj[v].add(u); 
        if (adj[u]==null) adj[u] = new ArrayList();
        adj[u].add(v); 
    }
于 2012-10-24T18:59:31.813 に答える
1

確かに配列を作成しましたが、配列の各要素を割り当てていません。そのため、存在しない要素に追加しようとすると、NullPointerExceptionが発生します。

ちなみに、リストのリストを作成すると、達成しようとしていることがはるかに見栄えが良くなります。言い換えると:

List<List<Integer>> yourList = new ArrayList<List<Integer>>();

次に、 yourList内の個々のリストを初期化してから、要素をそのリストに配置できます。

于 2012-10-24T19:03:52.847 に答える
0
List<Integer>[] adj = (List<Integer>[]) new ArrayList[1000];

1000adj件の参照へのArrayList参照です。これらの各 も初期化する必要がありArrayListます。

private final int MAX = 1000;
static List<Integer>[] adj = (List<Integer>[]) new ArrayList[MAX];
public static void main(String[] args) {
    for (int i = 0; i < MAX; i++){
       adj[i] = new ArrayList();
    }

    int edge, u, v, source;
    Scanner input = new Scanner(System.in);
    edge = input.nextInt();


    for (int i = 0; i < edge; i++) {
        u = input.nextInt();
        v = input.nextInt();
        adj[v].add(u); // Null pointer Exception
        adj[u].add(v); // Null pointer Exception
    }
于 2012-10-24T19:09:08.877 に答える