Nice programing

java.lang.IndexOutOfBoundsException : 소스가 대상에 맞지 않습니다.

nicepro 2020. 11. 21. 09:16
반응형

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예외.

참고 URL : https://stackoverflow.com/questions/6147650/java-lang-indexoutofboundsexception-source-does-not-fit-in-dest

반응형