Conversão de vetores bidimensionais

Bom, eu estou a muito tempo tentando entender porque meu código esta dando errado, vamos ao codigo:

for (int i = 0; i < fim.length; i++) {
for (int j=0;j<fim[0].length;j++){
fim[i][j]= Character.getNumericValue(par[i][j]);
}
}

Fim = uma matriz de valores inteiros 4x4 ;
par = uma matriz de valores char 4x4.

No código estou tentando converter para inteiro os valores de par, e guardando em fim. O provável motivo do erro é que par vem de outra matriz char 3x3, eu precisava expandi-la, e adicionar novos valores, então criei uma maior, em seguida tentei converter os char para inteiro.
porem o valor das bordas inferior e direita vem tudo bugado, provavelmente por causa dessa diferença de 3x3 e 4x4, não sei se fui bem claro, mas aqui vai o código inteiro pra entender melhor:

public static void main(String[] args) {
Scanner s = new Scanner(System.in);
char matriz [][] = new char [3][3];
char par [][] = new char [4][4];
int fim[][] = new int [4][4];

   String bin;
   System.out.println("digite uma sequencia de 9 digitos em binario: ");
   bin=s.next();

   //System.out.println(bin);
   
   // converte o int em String e cria um array de chars com base na String
   char[] digitos = String.valueOf( bin ).toCharArray();

   // matriz com os dados
   int cont = 0;
   for(int i = 0;i< matriz.length;i++){
       for(int j=0;j<matriz[0].length;j++){
           
           matriz[i][j] = digitos [cont];
           cont++;
       }    
   }
   
   // Só testando pra ver se a matriz ta saindo ok
   //Esta ok
    System.out.println("matriz: ");
     for (int i = 0; i < matriz.length; i++) {
         for (int j = 0; j < matriz.length; j++) {
             System.out.print(matriz[i][j]);
         }
         System.out.println(" ");
    }
    
    // Transferindo bits para uma matriz maior
    for(int i = 0;i< matriz.length;i++){
       for(int j=0;j<matriz[0].length;j++){
           
           par[i][j]=matriz[i][j];
          
       }    
   }
    //Só estanto pra ver se a par ta saindo ok
    //Esta ok
    System.out.println("Par: ");
     for (int i = 0; i < par.length; i++) {
         for (int j = 0; j < par.length; j++) {
             System.out.print(par[i][j]);
         }
         System.out.println(" ");
    }

    
    //Conversão do vetor para inteiro
    for (int i = 0; i < fim.length; i++) {
        for (int j=0;j<fim[0].length;j++){
	fim[i][j]= Character.getNumericValue(par[i][j]);
     }
    }
    //Só estanto pra ver se a fim ta saindo ok
    // ERROR
    System.out.println("fim: ");
     for (int i = 0; i < fim.length; i++) {
         for (int j = 0; j < fim.length; j++) {
             System.out.print(fim[i][j]);
         }
         System.out.println(" ");
    }

    
    // checar linhas
    for(int i=0;i<2;i++){
    // Adicionando bits de paridade
    
         if(fim[i][0] + fim[i][1] + fim[i][2] == 0)
    fim[i][3] = 1;
    else if(fim[i][0] + fim[i][1] + fim[i][2] == 1)
    fim[i][3] = 0;
    else if(fim[i][0] + fim[i][1] + fim[i][2] == 2)
    fim[i][3] = 1;
    else if(fim[i][0] + fim[i][1] + fim[i][2] == 3)
    fim[i][3] = 0;
    }
    
    // checar colunas
    for(int j=0;j<2;j++){
    // Adicionando bits de paridade
    
    if(fim[0][j] + fim[1][j] + fim[2][j] == 0)
    fim[j][3] = 1;
    else if(fim[0][j] + fim[1][j] + fim[2][j] == 1)
    fim[j][3] = 0;
    else if(fim[0][j] + fim[1][j] + fim[2][j] == 2)
    fim[j][3] = 1;
    else if(fim[0][j] + fim[1][j] + fim[2][j] == 3)
    fim[j][3] = 0;
    }

    System.out.println(imprimir(fim));

    //Impressão com bits
    //for(int i = 0;i< matriz.length;i++){
     //  for(int j=0;j<matriz[0].length;j++){
           
     //      System.out.print(par[i][j]);
          
     //  }    
     //   System.out.println(" ");
 //  }
    
}



//Teste de paridade
public static String imprimir (int x[][]){
    String saida = "";
    System.out.println();
    System.out.println("Com bits de paridade:\n");

for (int i = 0; i < x.length; i++) {
for (int j = 0; j < x[0].length; j++) {
saida = saida + x[i][j] ; //imprime caracter a caracter
}
saida = saida +"\n"; //muda de linha
}

return saida ;

}

Eu executei aqui seu código e os valores das bordas inferior e direita vem com um quadrado no console, isso significa que essas posições estão vazias. O que faz sentido porque você está percorrendo uma matriz 3x3 pra preencher uma matriz 4x4.
O que você queria que tivesse nos valores nas bordas inferior e direita?

Em “Conversão do vetor para inteiro” use fim[i][j] = par[i][j] - 48; para converter para int
Seria o mesmo que: fim[i][j] = par[i][j] - '0';

E leva em consideração o que o @LuanFroehlich disse. Isso será um problema.
Deixe todos como matriz[3][3] .

for(int i=0;i<2;i++){
// Adicionando bits de paridade

         if(fim[i][0] + fim[i][1] + fim[i][2] == 0)
    fim[i][3] = 1;
    else if(fim[i][0] + fim[i][1] + fim[i][2] == 1)
    fim[i][3] = 0;
    else if(fim[i][0] + fim[i][1] + fim[i][2] == 2)
    fim[i][3] = 1;
    else if(fim[i][0] + fim[i][1] + fim[i][2] == 3)
    fim[i][3] = 0;
    }
    
    // checar colunas
    for(int j=0;j<2;j++){
    // Adicionando bits de paridade
    
    if(fim[0][j] + fim[1][j] + fim[2][j] == 0)
    fim[j][3] = 1;
    else if(fim[0][j] + fim[1][j] + fim[2][j] == 1)
    fim[j][3] = 0;
    else if(fim[0][j] + fim[1][j] + fim[2][j] == 2)
    fim[j][3] = 1;
    else if(fim[0][j] + fim[1][j] + fim[2][j] == 3)
    fim[j][3] = 0;
    }

Aqui eu testei os bits da matriz, a intenção é sempre ficar um numero impar de bits 1 em cada linha e em cada coluna, então eu testo pra saber quantos tem, e adiciono 0 ou 1 na borda dependendo do resultado, exemplo:
111000111

111 0
000 1
111 0
111

Os bits que entraram é o que o código a cima devia fazer se estivesse tudo ok.

// checar linhas
for(int i=0;i<2;i++){
// Adicionando bits de paridade
switch (fim[i][0] + fim[i][1] + fim[i][2]) {
case 0:
fim[i][3] = 1;
break;
case 1:
fim[i][3] = 0;
break;
case 2:
fim[i][3] = 1;
break;
case 3:
fim[i][3] = 0;
break;
default:
break;
}
}

    // checar colunas
    for(int j=0;j<2;j++){
       // Adicionando bits de paridade
       switch (fim[0][j] + fim[1][j] + fim[2][j]) {
           case 0:
               fim[3][j] = 1;
               break;
           case 1:
               fim[3][j] = 0;
               break;
           case 2:
               fim[3][j] = 1;
               break;
           case 3:
               fim[3][j] = 0;
               break;
           default:
               break;
       }
    }

Tinha um erro besta, corrigi e coloquei em um switch pra ficar mais facil entender

Consegui aqui galera, era só uns erros bem besta mesmo que passaram despercebido, muito obrigado pela ajuda, segue o código:

public static void main(String[] args) {
Scanner s = new Scanner(System.in);
char matriz [][] = new char [3][3];
char par [][] = new char [4][4];
int fim[][] = new int [4][4];

   String bin;
   System.out.println("digite uma sequencia de 9 digitos em binario: ");
   bin=s.next();

   //System.out.println(bin);
   
   // converte o int em String e cria um array de chars com base na String
   char[] digitos = String.valueOf( bin ).toCharArray();

   // matriz com os dados
   int cont = 0;
   for(int i = 0;i< matriz.length;i++){
       for(int j=0;j<matriz[0].length;j++){
           
           matriz[i][j] = digitos [cont];
           cont++;
       }    
   }
   
   // Só testando pra ver se a matriz ta saindo ok
   //Esta ok
    System.out.println("matriz: ");
     for (int i = 0; i < matriz.length; i++) {
         for (int j = 0; j < matriz.length; j++) {
             System.out.print(matriz[i][j]);
         }
         System.out.println(" ");
    }
    
    // Transferindo bits para uma matriz maior
    for(int i = 0;i< matriz.length;i++){
       for(int j=0;j<matriz[0].length;j++){
           
           par[i][j]=matriz[i][j];
          
       }    
   }
    //Só estanto pra ver se a par ta saindo ok
    //Esta ok
    System.out.println("Par: ");
     for (int i = 0; i < par.length; i++) {
         for (int j = 0; j < par.length; j++) {
             System.out.print(par[i][j]);
         }
         System.out.println(" ");
    }

    
    //Conversão do vetor para inteiro
    for (int i = 0; i < fim.length; i++) {
        for (int j=0;j<fim[0].length;j++){
	fim[i][j]= Character.getNumericValue(par[i][j]);
     }
    }
    //Só estanto pra ver se a fim ta saindo ok
    // ERROR
    //Apenas par avizualização
    System.out.println("fim: ");
     for (int i = 0; i < fim.length; i++) {
         for (int j = 0; j < fim.length; j++) {
             System.out.print(fim[i][j]);
         }
         System.out.println(" ");
    }

    
    // checar linhas
    for(int i=0;i<fim.length;i++){
       // Adicionando bits de paridade
       switch (fim[i][0] + fim[i][1] + fim[i][2]) {
           case 0:
               fim[i][3] = 1;
               break;
           case 1:
               fim[i][3] = 0;
               break;
           case 2:
               fim[i][3] = 1;
               break;
           case 3:
               fim[i][3] = 0;
               break;
           default:
               break;
       }
    }
    
    // checar colunas
    for(int j=0;j<fim.length;j++){
       // Adicionando bits de paridade
       switch (fim[0][j] + fim[1][j] + fim[2][j]) {
           case 0:
               fim[3][j] = 1;
               break;
           case 1:
               fim[3][j] = 0;
               break;
           case 2:
               fim[3][j] = 1;
               break;
           case 3:
               fim[3][j] = 0;
               break;
           default:
               break;
       }
    }

    System.out.println(imprimir(fim));

    //Impressão com bits
    //for(int i = 0;i< matriz.length;i++){
     //  for(int j=0;j<matriz[0].length;j++){
           
     //      System.out.print(par[i][j]);
          
     //  }    
     //   System.out.println(" ");
 //  }
    
}



//Teste de paridade
public static String imprimir (int x[][]){
    String saida = "";
    System.out.println();
    System.out.println("Com bits de paridade:\n");

for (int i = 0; i < x.length; i++) {
for (int j = 0; j < x[0].length; j++) {
saida = saida + x[i][j] ; //imprime caracter a caracter
}
saida = saida +"\n"; //muda de linha
}

return saida ;

}