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.copyJavaDocs 의 핵심 부분 :
목적지 목록은 최소한 소스 목록만큼 길어야합니다. 더 길면 대상 목록의 나머지 요소는 영향을받지 않습니다.
당신은 단지를 통과해야 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 |