Dúvida - Arrays

Galera, eu compilei o seguinte código:

public class Question14 {
	public static void main(String[] args) {
	    A13[]     a1 = new A13[1];          // 1
	    A13[][]   a2 = new A13[2][1];     // 2
	    A13[][][] a3 = new A13[3][3][3];// 3
	    System.out.print(a3[2][2][2]);    // 4
	    a1[0] = new A13();                    // 5
	    a2[0] = a2[1] = a1;                   // 6
	    a3[0] = a3[1] = a3[2] = a2;       // 7
	    System.out.print(a3[2][2][2]);    //8
	}
}

Se eu comentar a linha Linha 8, o resultado sairia null. Se eu tirar o comentário, o resultado é um erro em tempo de excução: nullException in thread “main” java.lang.ArrayIndexOutOfBoundsException: 2 at Question14.main(Question14.java:12).

Por que na linha 4 o o item a3[2][2][2] é null e na linha 8 o mesmo item gera um erro?

A sua array a3 tem 3 elementos, que você inicializa com a2.

a3 { a2, a2, a2 }

O a2, por sua vez, tem 2 elementos, que são o a1:

a2 { a1, a1 }

Logo, você tem

a3 { {a1, a1}, {a1, a1 }, { a1, a1 }}

Quando acessa a3[2][2][2], está tentando acessar:

1 - a3[2] -> 3o. (terceiro) elemento de a3: {a1, a1}
2 - a3[2][2] -> 3o. (terceiro) elemento do resultado acima, o que dá null, pois só existem 2 elementos!

Entendeu mais ou menos?

Abraços,

Rodrigo

Porque o conteúdo dele mudou, veja:

quando você faz isso:

 a3[0] = a3[1] = a3[2] = a2;

Você está atribuindo às 3 dimensões principais de a3, arrays de dimensão diferente. Veja que, independentemente do momento em que você instancia o array, se você atribuir valor a ele com um outro array de tamanho diferente, ele fica com o novo tamanho.

Não sei se consegui ser claro…

Abraço,

Armando

Bom dia!

Você está a instânciar a1 com 1 só dimensão(0), a2 com 2(0,1) e a3 com três(0,1,2).

Quando você chama a3[2][2][2] , estas a chamar a3[2](até aqui ok, você tem instanciado um objeto aqui, mesmo que ele seja nulo), logo depois você chama [2] desse objeto e é aí que começa o problema. Lembra que instanciaste a2 com 2 posições(0 e 1)? Quando chamas a posição 3([2]) não há índice colocado para essa array, fazendo que lance a exceção : ArrayIndexOutOfBoundsException(IndiceDaArrayForaDosLimites). Mesmo que você fale que a array tem [3][3][3], se você iniciá-la com menos índices, gerará esse erro. Sei que ficou meio confuso, mas torne a perguntar o que não entendeu.

Até!

Galera, valeu pela ajuda.

O que conclui foi o que armando disse: no começo o array a3[2] é um array de 2 x 2 elementos (a3[2][2[2]).
Então quando chamamos a linha 4:

System.out.print(a3[2][2][2]); 

É impresso null.

Depois o array a3[2] recebe um array de 1 elemento:

a1[0] = new A13();                    // 5
a2[0] = a2[1] = a1;                   // 6
a3[0] = a3[1] = a3[2] = a2;

Tanto que se compilarmos assim:

System.out.print(a3[2][1][0]);

Não daria erro algum.

Obrigado pela atenção!

[quote=maquiavelbona]Bom dia!

Você está a instânciar a1 com 1 só dimensão(0), a2 com 2(0,1) e a3 com três(0,1,2).

Quando você chama a3[2][2][2] , estas a chamar a3[2](até aqui ok, você tem instanciado um objeto aqui, mesmo que ele seja nulo), logo depois você chama [2] desse objeto e é aí que começa o problema. Lembra que instanciaste a2 com 2 posições(0 e 1)? Quando chamas a posição 3([2]) não há índice colocado para essa array, fazendo que lance a exceção : ArrayIndexOutOfBoundsException(IndiceDaArrayForaDosLimites). Mesmo que você fale que a array tem [3][3][3], se você iniciá-la com menos índices, gerará esse erro. Sei que ficou meio confuso, mas torne a perguntar o que não entendeu.

Até![/quote]