Erro ao mostrar uma parte da matriz

32 respostas Resolvido
java
S

Quando você for executar o código você vai entender

System.out.print("Tamanho: ");
    int n = sc.nextInt();
    System.out.println();
    int[][] mat = new int[n][n];

    for (byte i = 0; i < mat.length; i++) {
      for (byte j = 0; j < mat[i].length; j++) {
        mat[i][j] = sc.nextInt();
      }
    }

    System.out.println();
    System.out.println("===== MATRIZ =====");
    System.out.println();

    for (byte i = 0; i < mat.length; i++) {
      for (byte j = 0; j < mat[i].length; j++) {
        System.out.print(mat[i][j] + " ");
      }
      System.out.println();
    }

    System.out.println();
    System.out.println("===== PRINCIPAL =====");
    System.out.println();

    for (byte i = 0; i < mat.length; i++) {
      int a = 1 + i;
      System.out.print(mat[i][i] + " " + "-" + " " + "[" + a + ", " + a + "]" + "\n");
    }

    System.out.println();
    System.out.println("===== PRINCIPAL 2° =====");
    System.out.println();

    for (byte i = 0; i < mat.length-1; i++) {
      int a = 1 + i;
      System.out.print(mat[i + 1][i + 1] + " " + "-" + " " + "[" + a + ", " + a + "]" + "\n");
    }

    System.out.println();
    System.out.println("===== SECUNDÁRIA =====");
    System.out.println();

    for (byte i = 0; i < mat.length - 1; i++) {
      int a = 0;
        System.out.print(mat[i][i + 2] + " - " + "[" + a + ", " + a + 2);
      if (i == 1) {
        System.out.print(mat[i][i] + " - " + "[" + a + 1 + ", " + a + 1);
      } else if (i == 2) {
        System.out.print(mat[i][i - 2] + " - " + "[" + a + 2 + ", " + a);
      }
    }

32 Respostas

D

Qual o erro, cara? Quer que a gente adivinhe?

S

Eu executo uma matriz 3x3
Quando ele imprime a Diagonal secundária da esse erro:

java.lang.ArrayIndexOutOfBoundsException: length=3; index=3
	at Matrizes.Main.main(Main.java:47)
	at java.lang.reflect.Method.invoke(Native Method)
	at com.duy.android.compiler.java.Java.run(Java.java:115)
	at com.duy.ide.javaide.run.activities.ExecuteActivity.executeDex(ExecuteActivity.java:147)
	at com.duy.ide.javaide.run.activities.ExecuteActivity.exec(ExecuteActivity.java:124)
	at com.duy.ide.javaide.run.activities.ExecuteActivity.access$100(ExecuteActivity.java:45)
	at com.duy.ide.javaide.run.activities.ExecuteActivity$1.run(ExecuteActivity.java:88)
	at java.lang.Thread.run(Thread.java:764)
D

Essa exceção indica que você está tentando acessar uma posição que não existe. Exemplo:

int[] vetor = new int[5];
System.out.println(vetor[5]);

Como o vetor possui tamanho 5 e o primeiro índice é zero, é impossível acessar a posição 5 do vetor (afinal, as “casas” dele vão de 0 a 4).
O erro, provavelmente, seja nesta linha.

S

Esse erro na “Principal 2” era porque eu esqueci de colocar o mat.lenght-1 dentro do for

Esse erro que eu mostrei é da “secundária”

D

Mesma coisa

S

Essa é a matriz 3x3:

0 1 2 1 2 3
0 1 2 —> 1 2 3
0 1 2 1 2 3

Aqui ele imprime o número que está na posição 0,2 sendo i = 0, ou seja, o 3

System.out.print(mat[i][i + 2] + " - " + "[" + a + ", " + a + 2);

Aparenta que o erro está aqui, pois a partir daqui ele não imprime

if (i == 1) {
    System.out.print(mat[i][i] + " - " + "[" + a + 1 + ", " + a + 1);

Eu não entendo o que está errado

Tamanho: 3

1 2 3 
1 2 3
1 2 3

===== MATRIZ =====

1 2 3 
1 2 3 
1 2 3 

===== PRINCIPAL =====

1 - [1, 1]
2 - [2, 2]
3 - [3, 3]

===== PRINCIPAL 2° =====

2 - [1, 1]
3 - [2, 2]

===== SECUNDÁRIA =====

3 - [0, 02 // O erro ocorre no próximo número
D

Cara, a questão das matrizes e/ou vetores é: você só acessa as “casas” a partir do índice 0 até o índice N onde N = tamanho do vetor - 1.
Se a matriz é de ordem 3x3, você nunca vai poder acessar posições cujo índice da linha ou coluna seja maior que 2.
Dado que 1 + 2 = 3, esta linha

System.out.print(mat[i][i + 2] + " - " + "[" + a + ", " + a + 2);

Está causando o problema.

S

Mas nesse caso i=0

D

Será mesmo?

Parte a parte:

byte i = 0; // Começando de 0
i < mat.length - 1; //Enquanto i for menor que o tamanho da matriz - 1
i++ //incrementa i

Faz um teste de mesa e vê quantas iterações ocorrem com tais condições. Além, obviamente, de quais valores i assume.

S
System.out.print(mat[i][i + 2] + " - " + "[" + a + ", " + a + 2); // 
      if (i == 1) {
        System.out.print(mat[i][i] + " - " + "[" + a + 1 + ", " + a + 1); 
      } else if (i == 2) {
        System.out.print(mat[i][i - 2] + " - " + "[" + a + 2 + ", " + a); 
      }

No primeiro Sysout i = 0
Segundo i = 1
Terceiro i = 2

Quando ele executa o for, automaticamente ocorre o i++?

D

Sim.

i = 1
1 + 2 = 3
Aí está teu erro, fera.

S

Quando eu coloco -1 em um dos dois i, ainda dá erro

System.out.print(mat[i][i-1] + " - " + "[" + a + 1 + ", " + a + 1);

ou

System.out.print(mat[i-1][i] + " - " + "[" + a + 1 + ", " + a + 1);

D

Você inicia o laço setando i = 0. 0 - 1 = -1
Assim sendo, você tenta acessar a posição -1 da linha ou coluna. Por isso o erro.

S

Não entendi isso

D

Cara, de novo.

Faça o teste de mesa, coloque os valores que quiser. Só assim você vai conseguir ver que está errando em coisa pequena

S

Coloquei ele e deu erro

D

Sim, cara, desde aqui

Eu estou falando a mesma coisa, de modos diferentes e você não quer aceitar.
Se você tem um vetor de 10 posições, a posição com maior índice que pode ser acessada é a 9. Nem 10, nem 11, nem 15.
O mesmo vale para matrizes. Uma matriz pode ser entendida como um conjunto de vetores. Muitas das vezes trabalhamos com a ideia de que elas são quadradas, ou seja, a mesma quantidade de linhas e colunas. Mais ainda: consideramos que as matrizes possuem dimensões iguais, ou seja, cada linha possui a mesma quantidade de colunas.
Para fins de estudo e entendimento, essas simplificações são válidas. Para o mundo real, nem sempre.

Agora, vamos tentar esclarecer:

Índice: | 0 | 1 | 2 | 3 | 4 |
Valor : | 3 | 5 | 7 | 9 | 0 |

Me diga, qual o tamanho deste vetor?
Qual o valor no índice 3? E qual o valor no índice 1? E qual o valor no índice 5?

D

Errado. Este vetor não possui um índice 5. Então, é um IndexOutOfBoundsException

S

Eu disse 0 porquê ele não existe

D

Cara, existe diferença entre 0, nulo e não existe.
Você precisa considerar a maneira como o java lida com tais situações e, neste caso, a exceção será lançada assim que for identificado que há uma tentativa de acessar uma posição/índice inexistente no vetor/matriz

S

Mas me explica, onde exatamente eu tenho que mudar para solucionar isso?

S

Eu entendi agora, quando eu usei mat.lenght - 1 o vetor virou 2, ou seja 0 e 1 né?

D

Você só pode iterar nas linhas e colunas que estão dentro do limite de tamanho da matriz. Se a matriz tem ordem 3x3, você só pode ir de 0 a 2.
Qualquer tentativa de acessar posições fora desse intervalo, vai disparar erro.

S

Eu alterei algumas coisas e ainda não deu certo. A matriz 3x3 que o Java faz é essa?

0,0 0,1 0,2
0,0 0,1 0,2
0,0 0,1 0,2

Ou essa

0,0 0,1 0,2
1,0 1,1 1,2
2,0 2,1 2,2

D

Sempre será da esquerda para a direita, de cima para baixo, logo, é a segunda

S

Eu tive que mudar totalmente para funcionar

for (byte  i = 0; i < 1; i++) { 
   System.out.println(mat[i][i+2]);
   System.out.println(mat[i+1][i+1]);
   System.out.println(mat[i+2][i]);
  }
D

Entre 0 e 1 só tem uma iteração. Logo, o for é dispensável.

S

Então eu posso retirar o for e deixar o resto?

D

O que você está tentando fazer? Qual o objetivo?

S

Fazer um programa que mostre todas as diagonais de um matriz IxI, e depois achar o determinante

D

Para isso você só precisa iterar sobre ela, não tem que inventar de mostrar o índice + qualquer coisa ou índice - qualquer coisa.

S
Solucao aceita

Consegui resolver

for (byte i = 0; i < mat.length; i++) {
      byte a = 1;
      if (i == 0) {
        System.out.println(mat[i][n - a]);
      }
      if (i > 0) {
        System.out.println(mat[i][n - i - 1]);
      }
    }
Criado 3 de outubro de 2019
Ultima resposta 6 de out. de 2019
Respostas 32
Participantes 2