[C#] 인덱스가 배열 범위를 벗어났습니다. (System.IndexOutOfRangeException) 해결 방법

인덱스가 배열 범위를 벗어났습니다. 오류는 특정 타입에 대해 지정한 인덱스 요소를 가져올 수 있는 객체에서 발생할 수 있는 예외입니다. 발생원인은 말 그대로 인덱스가 배열 범위를 벗어났기 때문입니다. 해결방법은 인덱스 변수를 점검하는 방법, 배열 범위를 점검하는 방법이 있습니다.

인덱스 배열 범위

인덱스가 배열 범위를 벗어났습니다

기본적인 어레이, 리스트 등을 포함하여 인덱스 속성이 있는 모든 객체가 예외발생 대상입니다. 다음은 리스트에 대한 컬렉션 가져오기입니다. 보통 인덱스 배열 범위 벗어남은 인덱스가 0보다 작거나 배열 카운트보다 클 때 발생합니다.

//
// 요약:
//     지정한 인덱스에 있는 요소를 가져오거나 설정합니다.
//
// 매개 변수:
//   index:
//     가져오거나 설정할 요소의 인덱스(0부터 시작)입니다.
//
// 반환 값:
//     지정한 인덱스의 요소입니다.
//
// 예외:
//   T:System.ArgumentOutOfRangeException:
//     index가 0보다 작습니다. 또는 index가 System.Collections.Generic.List`1.Count보다 크거나 같은 경우
public T this[int index] { get; set; }

인덱스가 배열 범위를 벗어났습니다.

다음 예제는 System.IndexOutOfRangeException 예외가 발생하도록 의도한 것입니다.

void BeomSang()
{
    int[] arr = { 1, 2, 3 };
    for (int i = 0; i <= arr.Length; i++)
    {
        Debug.WriteLine($"i({i}) = {arr[i]}");
    }
}
//'System.IndexOutOfRangeException' 형식의 예외가 BeomSang.exe에서 발생했지만 사용자 코드에서 처리되지 않았습니다.
//추가 정보: 인덱스가 배열 범위를 벗어났습니다.

예시에서 배열의 크기는 3이지만, for 반복문은 0부터 배열의 크기 이하를 만족하는 경우 진행하도록 하였습니다. 그리하여 배열 크기를 1 초과하는 반복을 한 번 더 진행하여 문제가 발생합니다.

다음과 같이 소스를 수정하여 해결할 수 있습니다. 해당 오류가 발생하는 코드를 유심히 보시면 인덱스가 미만 또는 초과가 되는 부분이 있을 것입니다. 참고로 예제는 (i <= arr.Length)에서 (i < arr.Length)으로 변경하였습니다.

void BeomSang()
{
    int[] arr = { 1, 2, 3 };
    for (int i = 0; i < arr.Length; i++)
    {
        Debug.WriteLine($"i({i}) = {arr[i]}");
    }    
}
//i(0) = 1
//i(1) = 2
//i(2) = 3

댓글