2011-09-18 7 views
0

자바에서 배열을 선언하면 다음과 같은 오류가 발생합니다. 예외 "main"java.lang.ArrayIndexOutOfBoundsException 스레드. 그럼에도 불구하고 변수 totalNumbers에는 값이 있습니다. 해당 변수를 5와 같은 숫자로 바꿀 때 작동합니다. 배열을 선언 할 때 숫자 여야합니까?자바에서 배열 선언

더 많은 코드가 추가되었지만 변수 이름과 설명은 스웨덴어로되어 있습니다. 하지만 아마도 코드는 저도 불구하고 understodd 수 있습니다!? 또는

// deklarera arrays för tal under 500 och för tal över 500 
int slumptalMindre[]; 
slumptalMindre = new int[antalSlumptalMindreÄn500]; 

int slumptalStörre[]; 
slumptalStörre = new int[antalSlumptal - antalSlumptalMindreÄn500]; 

//gå genom första array och omplacera tal till ny array 
for(int x = 0; x < antalSlumptal; x++) { 
    if(slumptal[x] < 500) { 

     slumptalMindre[x] = slumptal[x]; 
    } 

} 
+2

전체 코드가 맞습니까? 배열의 범위 밖에있는 멤버에 액세스하려고하면 범위를 벗어나는 인덱스가 발생합니다 ... –

+1

컴파일 가능한 코드 및 스택 추적을 게시하십시오. 배열 접근시'ArrayIndexOutOfBoundsException'이 던져 지지만 코드 배열에 접근하지 않았습니다. 초기화 된 곳에서만 접근합니다. –

+0

아니요, 이것은 모든 코드가 아닙니다. 숫자 대신 변수를 사용할 수 있는지 묻는 중이었습니다. –

답변

0

을 초기화하지만 코드에 따라 둘 다 양성 및 antalSlumptal>antalSlumptalMindreÄn500 가정합니다.

e.e. 하자 antalSlumptal = 20 = antalSlumptalMindreÄn500

5.이어서 slumptalMindre 배열의 길이가 5 및 slumptalStörre의 길이가 15 인 배열 slumptal하지만 어떠한 선언 없다.

for 루프 변수 x의 범위는 0에서 19까지이며 각 반복에서 색인 x가있는 배열 slumptalMindre에 액세스합니다. x 값이 5가되면 분명히 ArrayIndexOutOfBoundsException이 발생합니다.

의도가 무엇인지 추측 할 수 있습니다. 배열 slumptal에 일부 필터를 적용하고 500보다 작은 모든 값을 다른 배열에 넣으려는 것 같습니다.

필터 결과에 배열을 사용할 때의 한 가지 문제점은 루프가 완료된 후 결과의 길이를 알 수 없다는 것입니다. 하지만 미리 배열을 초기화해야합니다.

한 가지 해결책은 두 개의 루프를 사용하는 것일 수 있습니다. 첫 번째는 배열을 반복하고 500 이하의 숫자를 계산합니다. 그런 다음 올바른 크기로 배열을 초기화하고 두 번째 루프는 배열을 다시 반복하여 결과 값을 결과 배열에 복사합니다. 두번째 루프는 짧은 결과 어레이에 액세스하기 위해 배열 slumptal 액세스하기위한 인덱스와 인덱스 구별 자르해야 : 어레이를 반복하기 때문에

// count the numbers less than 500 
int count = 0; 
for(int x = 0; x < slumptal.length; x++) { 
    if(slumptal[x] < 500) 
    count++; 
} 
slumptalMindre = new int[count]; 

int y = 0; // Index to access array slumptalMindre 
for(int x = 0; x < slumptal.length; x++) { 
    if(slumptal[x] < 500) 
    slumptalMindre[y++] = slumptal[x]; 
}  

그러나 상기 해결책은 최적이 아닌 두번. 이는 결과가 고정 길이 배열이어야하기 때문입니다. 이 경우에는 List 같은 동적 크기의 데이터 구조를 사용하는 것이 더 쉽습니다 :

// Using a ArrayList of Integer values as the result 
List<Integer> slumptalMindre = new ArrayList<Integer>(); 

for(int x = 0; x < slumptal.length; x++) { 
    if(slumptal[x] < 500) 
    slumptalMindre.add(slumptal[x]); 
}  

또 하나의 힌트 코딩 스타일에 대해 : 자바에서 변수와 클래스 이름에 움라우트 사용하는 유효합니다. 그러나 그렇게하면 쉽게 문제가 발생할 수 있기 때문에 나쁜 스타일로 간주됩니다. Java 컴파일러는 -encoding 옵션을 지정하지 않으면 소스 파일에 대한 플랫폼 기본 인코딩을 사용합니다. Windows에서 기본 인코딩은 Cp1252이며, Linux는 대개 UTF-8입니다. Umlauts가 클래스 이름의 일부라면 Umlaut를 포함하는 클래스 파일 이름으로 이어지기 때문에 상황이 더욱 악화되었습니다.

0

배열에 어떤 값을 넣어 약간의 스웨덴어! = :) 배울 왜 ..... IndexOutOfBoundsException exception는 일반적으로 해당 배열의 주소가

방법을 배울 수 없습니다하는 를 호출 할 때 온다 당신은 값이 antalSlumptalMindreÄn500antalSlumptal 가능 무엇 게시되지 않은 배열보기 click here