programing

java.lang의 원인ArrayIndexOutOfBoundsException과 이를 방지하는 방법

prostudy 2022. 6. 12. 11:56
반응형

java.lang의 원인ArrayIndexOutOfBoundsException과 이를 방지하는 방법

무인 does does 가 뭐죠?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++) {

이 훌륭한 기사로부터:의 ArrayIndexOutOfBoundsException for loop

간단히 말하면:

의 마지막 반복에서

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

iname.length배열 인덱스가 0 기반이기 때문에 잘못된 인덱스입니다.

코드가 읽혀야 합니다.

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

즉, 경계 사이에 없기 때문에 유효하지 않은 배열의 인덱스에 액세스하려고 합니다.

예를 들어 상한 4의 원시 정수 배열을 초기화합니다.

int intArray[] = new int[5];

0으로 하다를 들면, ' 하면' '이렇게 ' '이렇게 돼요'ArrayIndexOutOfBoundsException5분 4번 4초

intArray[5];

ArrayIndexOutOfBoundsException

변수를 값을 배치할 수 있는 "상자"로 생각하는 경우 배열은 서로 옆에 배치된 일련의 상자입니다. 여기서 상자의 수는 유한하고 명시적인 정수입니다.

다음과 같은 배열 생성:

final int[] myArray = new int[5]

의 상자로 을 만듭니다.각 상자에는 5개의 상자가 있습니다.각 상자에는int각 상자에는 일련의 상자 안에 위치인 인덱스가 있습니다.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]

그냥 하지 마세요.위의 항목(인덱스를 사용해야 하는 경우)을 고수하면 많은 수고를 덜 수 있습니다.

가능한 경우 foreach를 사용합니다.

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];
}

어레이 인덱스의 Out-of-Bounds 예외를 방지하려면 가능한 경우 enhanced-문for 사용해야 합니다.

주요 동기(및 사용 사례)는 반복을 반복하고 복잡한 반복 단계를 필요로 하지 않는 경우입니다.향상된 기능을 사용할 수 없습니다.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");
}

코드에서는 인덱스 0부터 문자열 배열 길이까지 요소에 액세스했습니다. name.length 내의 수(만, 할 수 것은 의 경우 입니다.name[2]에서 "0"까지 할 수 name.length - 1★★★★★★★★★★의 입수처name.length오브젝트 수

「 」를 for하고 loop으로 .name.length - 1a[n]는 a[0]는 a[n-1]는 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');
}

지정된 어레이의 경우 어레이 길이는 3(즉, name.length = 3)입니다.그러나 인덱스 0부터 시작하는 요소를 저장하기 때문에 최대 인덱스 2가 됩니다.

그래서 'i**<=name' 대신.length'는 'ArrayIndexOutOfBoundsException'을 피하려면 'i<**name.length'로 입력해야 합니다.

이 질문은 여기까지입니다만, Java의 새로운 기능에 주목하고 싶습니다.이 기능을 사용하면, 초보자라도 어레이의 인덱스에 관한 혼란을 피할 수 있습니다.Java-8은 반복 작업을 추상화했습니다.

int[] array = new int[5];

//If you need just the items
Arrays.stream(array).forEach(item -> { println(item); });

//If you need the index as well
IntStream.range(0, array.length).forEach(index -> { println(array[index]); })

떤떤장 ?점 ??? 한 것입니다.번째로는 ' 된다', '걱정하지 않아도 된다' 입니다.ArrayIndexOutOfBoundsException

ArrayIndexOutOfBoundsException i<=name.length 파츠.name.lengthname 3번, 3번, 3번, 3번에, 「」에 액세스 ,name[3]불법이며 예외를 던집니다.

해결된 코드:

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

Java 언어 사양에 정의되어 있습니다.

public final 들 fieldlength이치노 length0으로 하다

어레이 인덱스가 범위를 벗어남 예외

Eclipse에서 이러한 유형의 예외가 발생할 경우 이렇게 나타납니다.빨간색 숫자는 액세스하려는 인덱스를 나타냅니다.코드는 다음과 같습니다.

myArray[5]

해당 배열에 존재하지 않는 인덱스에 액세스하려고 하면 오류가 발생합니다.배열의 길이가 3인 경우

int[] intArray = new int[3];

유효한 인덱스는 다음과 같습니다.

intArray[0]
intArray[1]
intArray[2]

배열의 길이가 1인 경우

int[] intArray = new int[1];

유효한 인덱스는 다음과 같습니다.

intArray[0]

배열 길이와 같거나 그보다 큰 정수는 모두 범위를 벗어납니다.

0:보다 작은 정수는 모두 범위를 벗어납니다.

추신: 어레이에 대해 더 잘 이해하고 실습을 하고 싶다면 여기에 비디오가 있습니다: Java 어레이 튜토리얼

배열의 경우, 수 .length올바른 차원의 특성입니다.하다

int [][][] a  = new int [2][3][4];

for(int i = 0; i < a.length; i++){
    for(int j = 0; j < a[i].length; j++){
        for(int k = 0; k < a[j].length; k++){
            System.out.print(a[i][j][k]);
        }
        System.out.println();
    }
    System.out.println();
}

에, 루프와 루프가 되고 있는 입니다.length차원의 (왜냐하면 '왜냐하면')a[i].length is is is is is와 a[j].length를 참조해 주세요.

는 " "를 사용해야 .a[i][j].length (오류)a[0][0].length.) , 심 , , , , , , , ,.

알 수 없는 것처럼 보이는 ArrayIndexOutOfBounds Exceptions의 가장 일반적인 경우는 SimpleDateFormat을 동시에 사용하는 경우입니다.특히 서블릿 또는 컨트롤러의 경우:

public class MyController {
  SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy");

  public void handleRequest(ServletRequest req, ServletResponse res) {
    Date date = dateFormat.parse(req.getParameter("date"));
  }
}

2개의 스레드가 SimplateDateFormat.parse() 메서드를 동시에 입력하면 ArrayIndexOutOfBoundsException이 나타납니다.SimpleDateFormat 클래스의 javadoc 동기화 섹션을 확인합니다.

코드 내에 서블릿이나 컨트롤러와 같은 동시 방식으로 SimpleDateFormat과 같은 스레드 안전하지 않은 클래스에 액세스하는 장소가 없는지 확인하십시오.서블릿 및 컨트롤러의 모든 인스턴스 변수를 검사하여 의심 가능성이 있는지 확인합니다.

길이 n의 배열에 대해 배열 요소의 인덱스는 0 ~n-1입니다.

프로그램이 어레이 인덱스가 n-1보다 큰 요소(또는 메모리)에 액세스하려고 하면 Java는 ArrayIndexOutOfBoundsException을 슬로우합니다.

여기 프로그램에서 사용할 수 있는 두 가지 솔루션이 있습니다.

  1. 개수 유지:

    for(int count = 0; count < array.length; count++) {
        System.out.println(array[count]);
    }
    

    아니면 다른 루핑 스테이트먼트 같은 것도요

    int count = 0;
    while(count < array.length) {
        System.out.println(array[count]);
        count++;
    }
    
  2. 각 루프에 대해 를 사용하는 것이 좋습니다.이 방법에서는 프로그래머가 배열 내의 요소 수를 신경 쓸 필요가 없습니다.

    for(String str : array) {
        System.out.println(str);
    }
    

이 예외가 발생할 때마다 ArrayIndexOutOfBoundsException은 범위를 벗어나거나 일반인이 요구하는 어레이 인덱스를 사용하려는 것을 의미합니다.

이를 방지하려면 배열 길이가 10인 경우, 항상 배열에 없는 인덱스를 요청하지 않도록 하십시오. 색인의 범위는 0에서 9 사이여야 합니다.

ArrayIndexOutOfBounds는 할당되지 않은 배열 내의 위치를 인덱싱하려고 함을 의미합니다.

이 경우:

String[] name = { "tom", "dick", "harry" };
for (int i = 0; i <= name.length; i++) {
    System.out.println(name[i]);
}
  • name.length는 배열이 3개의 String 개체로 정의되어 있기 때문에 3입니다.
  • 배열 내용에 액세스할 때 위치는 0부터 시작합니다.3개의 아이템이 있기 때문에 name [0]="tom", name [1]="tom", name [2]="harry"를 의미합니다.
  • 루프할 때 name.length 이하일 수 있기 때문에 사용할 수 없는 name[3]에 액세스하려고 합니다.

이 문제를 해결하려면...

  • for 루프에서는 i< name . length 를 실행할 수 있습니다.그러면 이름[3]에 대한 루프가 방지되고 이름[2]에서 중지됩니다.

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

  • 각 루프에 대해 를 사용합니다.

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

  • list.for Each(사용자 액션) 사용(Java8 필요)

    String[] name = { "tom", "dick", "harry" }; Arrays.asList(name).forEach(System.out::println);

  • 어레이를 스트림으로 변환 - 필터, 텍스트 변환, 맵 변환 등 어레이에 대한 추가 '조작'을 수행할 경우 이 옵션이 적합합니다(Java8 필요).

    String[] name = { "tom", "dick", "harry" }; --- Arrays.asList(name).stream().forEach(System.out::println); --- Stream.of(name).forEach(System.out::println);

ArrayIndexOutOfBoundsException는 존재하지 않거나 이 어레이의 범위를 벗어나는 어레이의 인덱스에 액세스하려고 하는 것을 의미합니다.어레이 인덱스는 0에서 시작하여 길이 - 1로 끝납니다.

고객님의 경우

for(int i = 0; i<=name.length; i++) {
    System.out.print(name[i] +'\n'); // i goes from 0 to length, Not correct
}

ArrayIndexOutOfBoundsException는 존재하지 않는 name.length 인덱스 요소에 액세스하려고 할 때 발생합니다(어레이 인덱스의 길이는 -1로 끝납니다).< = > 를< 로 치환하는 것만으로, 이 문제는 해결됩니다.

for(int i = 0; i < name.length; i++) {
    System.out.print(name[i] +'\n');  // i goes from 0 to length - 1, Correct
}

고객님의 코드에 따라:

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

System.out.print(name.length)를 선택한 경우

3개입니다.

즉, 당신의 이름은 3입니다.

루프가 0부터3까지 가동되고 있어 '0부터2' 또는 '1부터3' 중 하나가 가동되고 있어야 합니다.

정답.

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

배열의 각 항목을 요소라고 하며, 각 요소는 숫자 인덱스에 의해 액세스됩니다.위의 그림에서 보듯이 번호부여는 0으로 시작합니다.예를 들어, 9번째 요소는 인덱스 8에서 액세스할 수 있습니다.

IndexOutOfBoundsException은 어떤 종류의 인덱스(배열, 문자열, 벡터 등)가 범위를 벗어났음을 나타내기 위해 느려집니다.

임의의 어레이 X 에 액세스 할 수 있습니다.[ 0 ~ ( X . length - 1) ]

여기에서는 어레이를 사용하는 방법 및 인덱스의 범위를 벗어나는 예외를 회피하는 방법에 대해 설명하는 모든 답변을 볼 수 있습니다.개인적으로 어레이는 피하고 있습니다.저는 Collections 클래스를 사용합니다.이 클래스는 어레이 인덱스를 완전히 처리해야 하는 어리석음을 회피합니다.루프 구조는 쓰기, 이해 및 유지보수가 용이한 코드를 지원하는 컬렉션을 통해 아름답게 작동합니다.

어레이의 길이를 사용하여 for 루프의 반복을 제어하는 경우 어레이의 첫 번째 항목의 인덱스는 항상 0입니다.따라서 배열의 마지막 요소의 인덱스는 배열 길이보다 1 적게 됩니다.

ArrayIndexOutOfBoundsException 인덱스에서 할 이러한 는 name 에서 Array size 에서 확인할 수 .

이 경우 for 루프에서 등호만 제거하면 됩니다.

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

어레이를 반복하는 것이 좋습니다.

for(String i : name )
      System.out.println(i);

이 오류는 루프 오버리미트 실행 시 발생합니다.이렇게 간단한 예를 들어보자.

class demo{
  public static void main(String a[]){

    int[] numberArray={4,8,2,3,89,5};

    int i;

    for(i=0;i<numberArray.length;i++){
        System.out.print(numberArray[i+1]+"  ");
    }
}

처음에는 어레이를 'number Array'로 초기화했습니다.그런 다음 일부 배열 요소가 for loop을 사용하여 인쇄됩니다.루프가 'i' 시간 실행 중인 경우 (numberArray[i+1] 요소)를 인쇄합니다.(i 값이 1이면 numberArray [i+1] 요소가 인쇄됩니다).i=(numberArray.length-2)일 때 배열의 마지막 요소가 인쇄된다고 가정합니다.'i' 값이 (numberArray.length-1)로 이동하면 인쇄할 값이 없습니다.이 시점에서 'ArrayIndexOutOfBoundsException'이 발생합니다.아이디어를 얻으시길 바랍니다.감사해요!

하면 Optional을 회피할 수 .NullPointerException ★★★★★★★★★★★★★★★★★」ArrayIndexOutOfBoundsException:

String[] array = new String[]{"aaa", null, "ccc"};
for (int i = 0; i < 4; i++) {
    String result = Optional.ofNullable(array.length > i ? array[i] : null)
            .map(x -> x.toUpperCase()) //some operation here
            .orElse("NO_DATA");
    System.out.println(result);
}

출력:

AAA
NO_DATA
CCC
NO_DATA

대부분의 프로그래밍 언어 색인은 0부터 시작합니다.따라서 i<=names.length 대신 i<names.length 또는 i<=names.length-1써야 합니다.

배열 길이보다 더 많은 데이터를 반복하거나 저장할 수 없습니다.이 경우 다음과 같이 할 수 있습니다.

for (int i = 0; i <= name.length - 1; i++) {
    // ....
}

또는 다음과 같습니다.

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

언급URL : https://stackoverflow.com/questions/5554734/what-causes-a-java-lang-arrayindexoutofboundsexception-and-how-do-i-prevent-it

반응형