Si hai ragione! Non ci avevo proprio fatto caso alla condizione del while più interno. Ho modificato il codice in questa maniera:
codice:
class Sudoku{

	public static boolean verificaSchema(int[][] schema){

		//verifica righe
		int i=0; //indice riga
		int j=0; //indice colonna
		int k=1;
		boolean diversi = true;
		while(i<9 && diversi){
			while(j<8 && diversi){
				while(k>=j+1 && k<=8 && diversi){
					if(schema[i][j]==schema[i][k])
						diversi=false;
					k++;
				}
				j++;
			}
			i++;
		}

		//verifica colonne
		boolean diversi2=true;
		if(diversi==true){
			i=0; //indice riga
			j=0; //indice colonna
			k=1;
			while(j<9 && diversi2){
				while(i<8 && diversi2){
					while(k>=i+1 && k<=8 && diversi2){
						if(schema[i][j]==schema[k][j])
							diversi2=false;
						k++;
					}
					i++;
				}
				j++;
			}
		}

		//verifica quadrato
		if(diversi && diversi2){


		return diversi && diversi2;
	}
}
Credo dovrebbe andar bene..
E come potresti testarlo con quel codice?
Come potrei fare altrimenti?