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++) {
i
name.length
배열 인덱스가 0 기반이기 때문에 잘못된 인덱스입니다.
코드가 읽혀야 합니다.
for (int i = 0; i < name.length; i++)
^
즉, 경계 사이에 없기 때문에 유효하지 않은 배열의 인덱스에 액세스하려고 합니다.
예를 들어 상한 4의 원시 정수 배열을 초기화합니다.
int intArray[] = new int[5];
0으로 하다를 들면, ' 하면' '이렇게 ' '이렇게 돼요'ArrayIndexOutOfBoundsException
5분 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 - 1
a[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.length
의 name
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
이치노length
0으로 하다
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을 슬로우합니다.
여기 프로그램에서 사용할 수 있는 두 가지 솔루션이 있습니다.
개수 유지:
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++; }
각 루프에 대해 를 사용하는 것이 좋습니다.이 방법에서는 프로그래머가 배열 내의 요소 수를 신경 쓸 필요가 없습니다.
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
'programing' 카테고리의 다른 글
Vue 라우터 링크에서 밑줄을 제거할 수 없음 (0) | 2022.06.12 |
---|---|
Vue: 렌더링된 이름 있는 슬롯 내의 Vue 컴포넌트 메서드에 액세스합니다. (0) | 2022.06.12 |
C 프로그래밍에서 정적 구조를 사용하는 이유와 시기 (0) | 2022.06.11 |
쇼트 코드에서 Vue 2 컴포넌트를 동적으로 주입합니다. (0) | 2022.06.11 |
어레이의 요소에 액세스하는 데 일정한 시간이 걸리는 이유는 무엇입니까? (0) | 2022.06.11 |