2010-04-26 8 views
3
public static void main(String[] args) 
{ 
    int [][]shatner = new int[1][1]; 
    int []rat = new int[4]; 
    shatner[0] = rat; 
    System.out.println(shatner[0][3]); 
}  

놀랍습니다. 출력은 0입니다. 왜 Java가 이러한 종류의 indexOutOfBound 오류를 검사하지 않습니까?이 Java 코드는 어떻게 작동합니까?

+2

인 2 차원 배열의 첫 번째 배열의 마지막 요소를 2 차원 배열의 단일 요소를 설정, 당신은 게시 절대와 대답 전혀 질문 없습니다. StackOverflow에서 일반적으로 질문이 먼저옵니다. –

+0

나는 그 질문이 "왜 그렇게 생각하니?"라고 생각한다고 생각합니다. – Bozho

+1

이것은 완전히 정당한 질문입니다. –

답변

6

놀라지 마십시오. Shatner [0]은 배열 (쥐)이고 길이는 4입니다. 그래서 shartner [0] [3]은 0이되는 쥐입니다 [3].

+0

hi nc3b : 그래서 shatner [0]은 int 배열의 모든 크기에 할당 될 수 있습니까? int [1] [1]은 무엇을 의미합니까? int [1]의 한 배열? – chun

+1

@chun - int [1] [1] 선언은 배열의 초기 크기를 설정합니다. 기본적으로 단일 요소를 포함하는 단일 배열의 배열입니다. 이 할당은이를 4 개의 요소를 포함하는 단일 배열의 배열로 변경합니다. Java에서 다차원 배열은 각 행에 대해 가변 길이를 가질 수 있습니다. – justkt

4

한계를 벗어나는 일은 없습니다.

shatner 배열의 0 번째 행이 int[4]으로 다시 초기화됩니다.

3

인덱스 초과 오류가 없습니다. shatner는 배열의 배열입니다. 길이가 1 인 첫 번째 배열을 길이가 4 인 새 배열로 바꿨습니다. 이제 shatner [0] [3]은 기억에있어서 합법적 인 장소입니다.

3

Java가 IndexOutOfBoundsException을 검사하지 않는 것은 아닙니다. 대답은 0이어야합니다. 즉 shatner의 0 번째 인덱스는 길이 4의 배열을 가리키는 것을 의미하기 때문에 키 라인

shatner[0] = rat; 

이다 shatner[0][4] 완전히 유효하다.

0

자바의 배열이 예상보다 약간 다르기 때문에 생각합니다. shatner을 [1] [1], 즉 {{0},{0}}과 같은 의미로 초기화합니다.

그러나 첫 번째 요소에 정수를 할당하여 메모리에 {{0,0,0,0},{0}}으로 설정하면 Java가 새로 할당 된 인덱스를 처리합니다.

+0

실제로 메모리에 int 배열을 가리키는 참조 배열이 있습니다. 메모리에서 배열의 클러스터는 서로 옆에있을 필요는 없으며, 가능하지도 않습니다. 특히 그는 첫 번째를 쥐에게 재배정 한 후. –

+0

int [1] [1]은 무엇을 의미합니까? int [ANYSIZE]의 한 배열? – chun

0

배열은 Java에서 직사각형 일 필요는 없습니다. 이것은 들쭉날쭉 한 배열이며 완벽하게 괜찮습니다.

+0

제 생각에 톱니 바퀴가 두 줄을 가져야하고, 길이가 같지 않을 것입니다. 이 변수는 행이 하나뿐입니다. – Phil

+0

아직 기술적으로는 들쭉날쭉 한 배열입니다. –

5

"indexOutOfBound 오류"는 어디에서 볼 수 있습니까? int 어레이 (크기 1), 즉, 2 차원 어레이의

  • Initalize 배열 (크기 1)의 내용이 0
  • Initalize int의 배열, 크기 4 콘텐츠 intialized되어있는 코드는 다음을 수행 0
  • 로 intialized되는이 크기 4 1D 배열에
  • 액세스 그래서 0
관련 문제