java.lang.IndexOutOfBoundsException : 소스가 대상에 맞지 않습니다.
다음 코드에서 :
static void findSubsets (ArrayList<Integer> numbers, int amount, int index)
{
ArrayList <Integer> numbersCopy = new ArrayList<Integer>(numbers.size());
Collections.copy(numbersCopy, numbers);
}
오류가 발생합니다.
Exception in thread "main" java.lang.IndexOutOfBoundsException: Source does not fit in dest
at java.util.Collections.copy(Collections.java:548)
at backtracking2.Main.findSubsets(Main.java:61)
왜?
용량은 크기와 동일하지 않습니다. 전달하는 크기 매개 변수는 단순히 크기에 충분한 메모리를 할당합니다. 실제로 요소를 정의하지는 않습니다. 실제로의 어리석은 요구 사항 Collections.copy
이지만 그럼에도 불구하고 하나입니다.
Collections.copy
JavaDocs 의 핵심 부분 :
목적지 목록은 최소한 소스 목록만큼 길어야합니다. 더 길면 대상 목록의 나머지 요소는 영향을받지 않습니다.
당신은 단지를 통과해야 List
받는 사람 ArrayList
의 모든 복사의 생성자 List
전부 문제를 방지 할 수 있습니다.
이것은 매우 좋은 질문이며 컬렉션 용량을 설정하는 것이 반드시 기본 객체를 할당하는 것은 아니라는 사실과 거의 확실하게 관련이 있습니다.
ArrayList <Integer> numbersCopy = new ArrayList<Integer>(numbers);
생성자 ArrayList(Collection<? extends E> c)
는 모든 요소를 c
새로 생성 된 인스턴스로 복사 numbers
하여 numbersCopy
. 그것은 numbersCopy.addAll(numbers)
또한 당신이 정말로 필요한 것입니다.
그것은 메이크업 감각 않습니다 Collection.copy
요구 dest
로부터 모든 요소를 보유 할 충분한 것으로 배열을 source
배열. 유사한 비유는 C 함수 memcpy
등입니다.
ArrayList
다른 방법을 ArrayList
사용하여 복사 하기 위해를 생성하는 동안 Collections.copy()
대상 List
에 source와 동일한 수의 값 (단지 동일한 크기가 아님)이 포함되어 있는지 확인해야합니다 List
. 소스는 예를 들어, ArrayList
값 [레드, 블루, 그린]을 가지고, 다음 대상이 ArrayList
아니라 같은 요소를 같은 수의 포함해야 [오렌지, 노란색, 파란색] .If 우리는을 만드는 ArrayList
소스의 같은 크기로 ArrayList
, 그것은 줄 것이다 OutOfBounds
예외.
'Nice programing' 카테고리의 다른 글
런처를 만드는 방법 (0) | 2020.11.21 |
---|---|
C ++에서 생성자의 실패를 처리하는 방법은 무엇입니까? (0) | 2020.11.21 |
Java 8에서 추상 클래스와 인터페이스의 차이점은 무엇입니까? (0) | 2020.11.21 |
프로그래밍 방식으로 이미지를 만화 화하는 방법은 무엇입니까? (0) | 2020.11.21 |
CSS로 플로트 탑을 어떻게 만들 수 있습니까? (0) | 2020.11.21 |