grazie mille desa per i tuoi preziosi consigli

Ho modificato l'algoritmo come segue:
codice:
//controlla che gli accoppiamenti siano tutti diversi
    public static boolean verificaCoppie(int[][]matrice2){


    	for(int i=0;i<matrice2.length-1;i++){

    		for(int j=0;j<matrice2[0].length;j+=2){

                    for(int x=i+1;x<matrice2.length-1;x++){

                        for(int y=0;y<matrice2[0].length;y+=2){

                            if(i!=x && j!=y && matrice2[i][j]==matrice2[x][y]){

                                if (matrice2[i][j] == matrice2[x][y] && matrice2[i][j + 1] == matrice2[x][j + 1])
                                    
                                    {
                                         return false;
                                }
                                
                            }
                            
                        }
                    }

    		}

    	}

    	return true;
    }
però ogni tanto mi da ancora qualche errore. Non sempre, però ogni tanto si quindi credo ci sia ancora qualcosina che non va

sto eseguendo più volte il programma per capire dove fa l'errore e con che "logica" capita. Ti posto l'intero programma cosi magari puoi provare pure tu

codice:
public class calendario{

    public static void main(String[] args){

        // creo la matrice con il numero di righe e colonne definite

        int matrice[][] = new int[5][8];

        do{

        matrice=creaMatrice(matrice);

        } while(verificaCoppie(matrice)==false);

       for(int i=0;i<matrice.length;i++){

           for(int j=0;j<matrice[0].length;j++){

              System.out.print("["+matrice[i][j]+"] ");
           }

           System.out.println();
       }
        
    }


    public static int[][]creaMatrice(int[][]matrice){

    // cliclo l'array bidimensionale

        for (int i = 0; i < matrice.length; i++) {


            for (int j = 0; j < matrice[0].length; j++) {


            	// Inizio controllo numeri diversi per riga

            	boolean unico;

            	do

            	{
            	  unico = true;

            	  matrice[i][j] = (int)(Math.random()*8)+1;

            	  for (int x = 0; x < j; x++)

            	  {
            	    if (matrice[i][j] == matrice[i][x])

            	    {

            	      unico = false;

            	    }

            	  }

            	} while (!unico);

            }

            }

        return matrice;

    }

    //controlla che gli accoppiamenti siano tutti diversi
    public static boolean verificaCoppie(int[][]matrice2){


    	for(int i=0;i<matrice2.length-1;i++){

    		for(int j=0;j<matrice2[0].length;j+=2){

                    for(int x=i+1;x<matrice2.length-1;x++){

                        for(int y=0;y<matrice2[0].length;y+=2){

                            if(i!=x && j!=y && matrice2[i][j]==matrice2[x][y]){

                                if (matrice2[i][j] == matrice2[x][y] && matrice2[i][j + 1] == matrice2[x][j + 1])

                                    {
                                         return false;
                                }
                                
                            }
                            
                        }
                    }

    		}

    	}

    	return true;
    }
}