2009-06-22 3 views
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 

위의 코드 단편은 인쇄 부분에서 예외를 발생시킵니다. 왜?왜이 중첩 ArrayList 코드가 예외를 throw합니까?

+0

예외를 지정하십시오. (대부분 ArrayIndexOutOfBoundsException입니다.) – akf

+0

ArrayLists를 사용하여 다차원 int 배열을 모방하려고했습니다. – akarnokd

답변

19

외부/내부 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() 인 경우 예외가 발생합니다.

+1

4 개의 공백으로 들여 쓰고 <를 이스케이프하지 않아도됩니다. 방금 당신을 위해서 했어요. –

0

당신은 for 루프에서 빈 배열 목록을 만들었습니다, 그래서 시도하는 액세스는 그 어떤 요소는

가 편집 죄송합니다, 늘 'null을 반환하는 대신 던져에서 System.out.println()에 null을 반환 ArrayIndexOutOfBoundsException입니다.

1

new ArrayList<Integer>(10)을 만들 때 "10"은 초기 용량을 나타냅니다. 아직 비어있는 목록이므로 get(9)으로 전화 할 수 없습니다.

2

나는 당신이 당신의 첫 번째 줄 이후

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

를 넣어 경우, 당신은 당신의 외부 배열의 크기가 0 인 것을 알 수 있다고 생각합니다. 따라서 루프는 0 번 실행되므로 루프 다음에 -의 -1 번째 요소를 요청하면 오류가 발생합니다.

1

a는 a.size() = 0이므로 a.get (a.size() - 1) 표현식 (a.size() - 1)은 -1이므로 a.get -1) new ArrayList(10) 처음 그것을 요소를 추가 할 때까지의 ArrayList가 비어 사이즈 10으로 설정 내부 보조 배열와 의 ArrayList를 생성하는 경우 ArrayIndexOutOfBoundsException이

0

참고 던진다. 생성자를 사용하면 초기 내부 크기를 최적화 측정 값으로 지정할 수 있습니다.