Почему этот вложенный код ArrayList вызывает исключение? - PullRequest
3 голосов
/ 23 июня 2009
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

Приведенный выше фрагмент кода вызывает исключение в части печати. Почему?

Ответы [ 6 ]

19 голосов
/ 23 июня 2009

Вы устанавливаете только емкость внешнего / внутреннего ArrayLists. Они все еще пусты.
И ваш цикл даже не выполняется, потому что a.size() равно 0.
Вам нужен второй внутренний цикл, чтобы добавить к ним элементы.

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 ().

2 голосов
/ 23 июня 2009

Я считаю, что если вы поставите

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

после первой строки вы увидите, что размер вашего внешнего массива равен нулю. Таким образом, цикл выполняется ноль раз, поэтому после цикла вы запрашиваете -1-й элемент - и это ошибка.

1 голос
/ 23 июня 2009

a - пустой список, поэтому a.size () = 0, поэтому в a.get (a.size () - 1) выражение (a.size () - 1) равно -1, поэтому a.get (- 1) выбрасывает ArrayIndexOutOfBoundsException

1 голос
/ 23 июня 2009

Когда вы создаете new ArrayList<Integer>(10), «10» просто указывает на начальную емкость. Это все еще пустой список, и вы не можете назвать get(9) для него.

0 голосов
/ 23 июня 2009

Обратите внимание, что new ArrayList(10) создает пустой ArrayList с его внутренним резервным массивом, изначально установленным на размер 10. ArrayList пуст, пока вы не добавите в него элементы. Конструктор позволяет указать исходный внутренний размер в качестве меры оптимизации.

0 голосов
/ 23 июня 2009

Вы создали пустые списки массивов в цикле for, поэтому при попытке доступа к любому элементу в них возвращается значение null для System.out.println ()

редактировать Извините, я не верну нулевое значение, но вместо этого создаю исключение ArrayIndexOutOfBoundsException.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...