Erro ao mostrar uma parte da matriz

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);
      }
    }

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

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)

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.

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”

Mesma coisa

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

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.

Mas nesse caso i=0

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.

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++?

Sim.

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

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);

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.

Não entendi isso

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

Coloquei ele e deu erro

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?

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

Eu disse 0 porquê ele não existe