원인은 무엇입니까 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];
}