[java] java.lang.ArrayIndexOutOfBoundsException의 원인은 무엇이며 어떻게 방지합니까?

무엇을 하는가 ArrayIndexOutOfBoundsException 의미하며 어떻게 제거합니까?

다음은 예외를 트리거하는 코드 샘플입니다.

String[] names = { "tom", "bob", "harry" };
for (int i = 0; i <= names.length; i++) {
    System.out.println(names[i]);
}



답변

첫 번째 포트는 합리적으로 명확하게 설명 하는 문서 여야합니다 .

잘못된 인덱스로 배열에 액세스했음을 나타냅니다. 인덱스가 음수이거나 배열 크기보다 크거나 같습니다.

예를 들어 :

int[] array = new int[5];
int boom = array[10]; // Throws the exception

그것을 피하는 방법에 관해서는 … 음, 그렇게하지 마십시오. 배열 인덱스에주의하십시오.

사람들이 때때로 겪는 한 가지 문제는 배열이 1- 인덱싱된다는 생각입니다

int[] array = new int[5];
// ... populate the array here ...
for (int index = 1; index <= array.length; index++)
{
    System.out.println(array[index]);
}

첫 번째 요소 (인덱스 0)가 누락되고 인덱스가 5 일 때 예외가 발생합니다. 유효한 인덱스는 0-4입니다. 올바른 관용구 for문은 다음과 같습니다.

for (int index = 0; index < array.length; index++)

( 물론 인덱스 가 필요 하다고 가정합니다 . 대신 고급 for 루프를 사용할 수 있다면 그렇게하십시오.)


답변

if (index < 0 || index >= array.length) {
    // Don't use this index. This is out of bounds (borders, limits, whatever).
} else {
    // Yes, you can safely use this index. The index is present in the array.
    Object element = array[index];
}

또한보십시오:


업데이트 : 코드 스 니펫에 따라

for (int i = 0; i<=name.length; i++) {

인덱스는 배열의 길이를 포함합니다. 이 범위를 벗어났습니다. 당신은 교체 할 필요 <=<.

for (int i = 0; i < name.length; i++) {


답변

이 훌륭한 기사에서 : for 루프의 ArrayIndexOutOfBoundsException

간단히 말해 :

마지막 반복에서

for (int i = 0; i <= name.length; i++) {

i 같을 것이다 name.length 배열 인덱스이기 때문에, 부정한 인덱스 인 제로 기반.

코드를 읽어야합니다

for (int i = 0; i < name.length; i++)
                  ^


답변

그것은 경계 사이에 있지 않으므로 유효하지 않은 배열의 인덱스에 액세스하려고한다는 것을 의미합니다.

예를 들어 상한 4로 기본 정수 배열을 초기화합니다.

int intArray[] = new int[5];

프로그래머는 0부터 계산합니다. 따라서 예를 들어 ArrayIndexOutOfBoundsException상한이 4이고 5가 아니기 때문에 a를 던질 것 입니다.

intArray[5];


답변

배열 인덱스 범위를 벗어난 예외를 방지하려면 Enhancedfor 문을 언제 어디서나 사용할 수 있어야합니다 .

주요 동기 부여 (및 사용 사례)는 반복 할 때 복잡한 반복 단계가 필요하지 않은 경우입니다. 당신은 할 수 없습니다 이 고급을 사용할 수for 하여 배열에서 뒤로 이동하거나 다른 모든 요소에서만 반복 .

이 작업을 수행 할 때 반복 할 요소가 부족하지 않도록 보장되며 [수정 된] 예제가 쉽게 변환됩니다.

아래 코드 :

String[] name = {"tom", "dick", "harry"};
for(int i = 0; i< name.length; i++) {
    System.out.print(name[i] + "\n");
}

… 이와 같습니다 :

String[] name = {"tom", "dick", "harry"};
for(String firstName : name) {
    System.out.println(firstName + "\n");
}


답변

원인은 무엇입니까 ArrayIndexOutOfBoundsException?

변수를 값을 배치 할 수있는 “상자”로 생각하면 배열은 서로 옆에 배치 된 일련의 상자이며 상자의 수는 유한하고 명시적인 정수입니다.

다음과 같은 배열 만들기 :

final int[] myArray = new int[5]

각각 5 개의 상자가있는 행을 만듭니다 int. 각 상자에는 일련의 상자에 위치하는 색인이 있습니다. 이 인덱스는 0에서 시작하여 N-1에서 끝납니다. 여기서 N은 배열의 크기 (상자 수)입니다.

이 일련의 상자에서 값 중 하나를 검색하려면 다음과 같이 색인을 통해 참조하십시오.

myArray[3]

이것은 첫 번째 상자에 색인 0이 있기 때문에 시리즈의 네 번째 상자 값을 제공합니다.

ArrayIndexOutOfBoundsException마지막으로 “상자”, 또는 음의 인덱스보다 높은 인덱스를 전달하여, 존재하지 않는 “상자”를 가져 오지 노력에 의해 발생합니다.

실행중인 예제 에서이 코드 스 니펫은 이러한 예외를 생성합니다.

myArray[5] //tries to retrieve the 6th "box" when there is only 5
myArray[-1] //just makes no sense
myArray[1337] //waay to high

피하는 법 ArrayIndexOutOfBoundsException

를 방지하기 위해 ArrayIndexOutOfBoundsException고려해야 할 몇 가지 핵심 사항이 있습니다.

루핑

배열을 반복 할 때 항상 검색하는 색인이 배열의 길이 (상자 수)보다 엄격하게 작아야합니다. 예를 들어 :

for (int i = 0; i < myArray.length; i++) {

<혼용하지 마십시오 =.

다음과 같은 일을하고 싶을 수도 있습니다.

for (int i = 1; i <= myArray.length; i++) {
    final int someint = myArray[i - 1]

하지마 위의 것을 고수하고 (색인을 사용해야하는 경우) 많은 고통을 덜어줍니다.

가능하면 다음을 사용하십시오.

for (int value : myArray) {

이런 식으로 인덱스에 대해 전혀 생각할 필요가 없습니다.

루핑 할 때 어떤 작업을 수행하더라도 루프 반복기의 값을 변경하지 마십시오 (여기 🙂 i. 이 값을 변경해야하는 유일한 장소는 루프를 계속 진행하는 것입니다. 달리 변경하면 예외가 발생할 수 있으며 대부분의 경우 필요하지 않습니다.

검색 / 업데이트

배열의 임의의 요소를 검색 할 때는 항상 배열의 길이에 대한 유효한 색인인지 확인하십시오.

public Integer getArrayElement(final int index) {
    if (index < 0 || index >= myArray.length) {
        return null; //although I would much prefer an actual exception being thrown when this happens.
    }
    return myArray[index];
}


답변

코드에서 인덱스 0에서 문자열 배열의 길이에 이르는 요소에 액세스했습니다. name.length는 문자열 객체 배열 즉, 3의 문자열 객체 수를 제공하지만 name[2]인덱스 0에서 객체 수 name.length - 1를 얻는 위치 까지 배열에 액세스 할 수 있기 때문에 최대 인덱스 2에만 액세스 할 수 있습니다 name.length.

for루프 를 사용하는 동안에도 인덱스 0으로 시작했으며로 끝나야합니다 name.length - 1. 배열 a [n]에서는 형식 a [0]에서 a [n-1]에 액세스 할 수 있습니다.

예를 들면 다음과 같습니다.

String[] a={"str1", "str2", "str3" ..., "strn"};

for(int i=0;i<a.length()i++)
    System.out.println(a[i]);

귀하의 경우 :

String[] name = {"tom", "dick", "harry"};

for(int i = 0; i<=name.length; i++) {
    System.out.print(name[i] +'\n');
}