3
ArrayList<ArrayList<Integer>> a = new ArrayList<ArrayList<Integer>>(5);
for (int i = 0 ; i < a.size() ; i++){
    a.set(i, new ArrayList<Integer>(10));
}
System.out.println(a.get(a.size()-1).get(9)); //exception thrown

上記のスニペットは、印刷部分で例外をスローします。なんで?

4

6 に答える 6

19

外側/内側の ArrayList の容量のみを設定します。それらはまだ空です。そして、あなたのループは 0
であるため実行さえしません 。それらに要素を追加するには、2 番目の内部ループが必要です。a.size()

ArrayList<ArrayList<Integer>> a = new ArrayList<ArrayList<Integer>>(5);
for (int i = 0; i < 5 ; i++) {
    List<Integer> lst = new ArrayList<Integer>(10);
    for (int j = 0; j < 10; j++) {
        lst.add(j);
    }   
    a.add(lst);
}
System.out.println(a.get(a.size()-1).get(9));

編集:そして気をつけてa.set(i, ...)ください。i >= a.size() の場合、例外がスローされます。

于 2009-06-22T20:09:09.823 に答える
2

あなたが置くなら私はそれを信じています

System.out.println(a.size());

最初の行の後、外側の配列のサイズがゼロであることがわかります。したがって、ループはゼロ回実行されるため、ループの後に - の -1 番目の要素を要求していますが、これはエラーです。

于 2009-06-22T20:14:07.130 に答える
1

を作成するnew ArrayList<Integer>(10)場合、「10」は単に初期容量を示します。それはまだ空のリストであり、呼び出すことはできませんget(9)

于 2009-06-22T20:13:23.060 に答える
1

a は空のリストなので a.size() = 0 なので a.get(a.size()-1) では式 (a.size() - 1) は -1 なので a.get(-1) はスローしますArrayIndexOutOfBoundsException

于 2009-06-22T20:15:31.120 に答える
0

内部バッキング配列が最初にサイズ10に設定された空のArrayListをnew ArrayList(10)作成することに注意してください。ArrayListは、要素を追加するまで空です。コンストラクターを使用すると、最適化の尺度として初期内部サイズを指定できます。

于 2009-06-22T20:32:46.687 に答える
0

for ループで空の配列リストを作成したため、それらの要素にアクセスしようとすると、 System.out.println() に null が返されます。

編集 申し訳ありませんが、null を返しませんが、代わりに ArrayIndexOutOfBoundsException をスローします。

于 2009-06-22T20:13:01.487 に答える