-2

次のコードでnullポインタ例外が発生します(より大きなプログラムの一部-「add」が呼び出された行で例外がスローされます)。

public class A
{
    static ArrayList<Integer> sets[];
    public static void main(String[] args)
    {
         sets = new ArrayList[5];
         sets[0].add(1);
    }
}

また、コンパイラがクラスレベルの変数(例:ArrayList)を静的にするように要求している理由もわかりません。私が知る限り、これらのことは静的なコンテキストにあるべきではありません(コンパイラーの問題ではなく、コーディングの実践の観点から)、それでもコンパイラーはそれを要求しています。

前もって感謝します。

4

3 に答える 3

3
 sets = new ArrayList[5];

5つのスポットを埋めるだけnull

呼び出しArrayList()を行う前に、位置ごとに明示的に設定する必要があります。add()

例:

sets[0] = new ArrayList<Integer>();
sets[0].add(5);
于 2013-02-07T03:53:03.013 に答える
1

この線

sets = new ArrayList[5];

配列を割り当てますが、配列のどの要素にもArrayListを配置しません。

あなたが必要になるでしょう

sets[0] = new ArrayList<Integer>();
sets[0].add(1);
于 2013-02-07T03:53:07.797 に答える
0

これは、配列がnull値で初期化されているためです。

//it will initialize sets variable
sets = new ArrayList[5];
//but set[0], set[1]... and on are null

配列アイテムを使用する前に、それらも初期化する必要があります

sets[0] = new ArrayList<Integer>();
sets[0].add(1);

また、より良い設計のために、クラスではなくインターフェースを対象としたプログラムを作成する必要があります。「インターフェースにプログラムする」とはどういう意味ですか?を参照 してください。詳細については。

つまり、コードは次のようになります。

public class A {
    static List<Integer> sets[];
    public static void main(String[] args) {
        sets = new List[5];
        sets[0] = new ArrayList<Integer>();
        sets[0].add(1);
        //extending your code in order to use more than one value of the List array
        sets[1] = new ArrayList<Integer>();
        sets[1].add(20);
        for(List<Integer> list : sets) {
            if (list != null) {
                System.out.println(list.get(0));
            }
        }
    }
}
于 2013-02-07T03:52:38.793 に答える