Class to generate CPF does not print on console

Asked

Viewed 690 times

2

I cannot print the generated Cpfs on the console.

I am studying this code and do not understand the problem, can anyone help me understand and learn to use this code, please?

package geraCPF;

import java.util.ArrayList;

import javax.swing.text.MaskFormatter;

public class GeraCPF {
    private ArrayList<Integer> listaAleatoria = new ArrayList<Integer>();
    private ArrayList<Integer> listaNumMultiplicados = null;

    //Metodo para geracao de um numero aleatorio entre 0 e 9
    public int geraNumAleatorio(){
        //Note que foi preciso fazer um cast para int, ja que Math.random() retorna um double
        int numero = (int) (Math.random() * 10);

        return numero;
    }   

    //Metodo para geracao de parte do nosso CPF (aqui geramos apenas os 9 primeiros digitos)
    public ArrayList<Integer> geraCPFParcial(){
        for(int i = 0; i < 9; i++){
            listaAleatoria.add(geraNumAleatorio());
        }

        return listaAleatoria;
    }

    //Metodo para geracao do primeiro digito verificador (para isso nos baseamos nos 9 digitos aleatorios gerados anteriormente)
    public ArrayList<Integer> geraPrimeiroDigito(){
        listaNumMultiplicados = new ArrayList<Integer>();
        int primeiroDigito;
        int totalSomatoria = 0;
        int restoDivisao;
        int peso = 10;

        //Para cada item na lista multiplicamos seu valor pelo seu peso
        for(int item : listaAleatoria){
            listaNumMultiplicados.add(item * peso);

            peso--;
        }

        //Agora somamos todos os itens que foram multiplicados
        for(int item : listaNumMultiplicados){
            totalSomatoria += item;
        }

        restoDivisao = (totalSomatoria % 11);

        //Se o resto da divisao for menor que 2 o primeiro digito sera 0, senao subtraimos o numero 11 pelo resto da divisao
        if(restoDivisao < 2){
            primeiroDigito = 0;
        } else{
            primeiroDigito = 11 - restoDivisao;
        }

        //Apos gerar o primeiro digito o adicionamos a lista
        listaAleatoria.add(primeiroDigito);

        return listaAleatoria;
    }

    //Metodo para geracao do segundo digito verificador (para isso nos baseamos nos 9 digitos aleatorios + o primeiro digito verificador)
    public ArrayList<Integer> geraSegundoDigito(){
        listaNumMultiplicados = new ArrayList<Integer>();
        int segundoDigito;
        int totalSomatoria = 0;
        int restoDivisao;
        int peso = 11;

        //Para cada item na lista multiplicamos seu valor pelo seu peso (observe que com o aumento da lista o peso tambem aumenta)
        for(int item : listaAleatoria){
            listaNumMultiplicados.add(item * peso);

            peso--;
        }

        //Agora somamos todos os itens que foram multiplicados
        for(int item : listaNumMultiplicados){
            totalSomatoria += item;
        }

        restoDivisao = (totalSomatoria % 11);

        //Se o resto da divisao for menor que 2 o segundo digito sera 0, senao subtraimos o numero 11 pelo resto da divisao
        if(restoDivisao < 2){
            segundoDigito = 0;
        } else{
            segundoDigito = 11 - restoDivisao;
        }

        //Apos gerar o segundo digito o adicionamos a lista
        listaAleatoria.add(segundoDigito);

        return listaAleatoria;
    }

    //Agora que temos nossa lista com todos os digitos que precisamos vamos formatar os valores de acordo com a mascara do CPF
    public String geraCPFFinal() {
        //Primeiro executamos os metodos de geracao
        geraCPFParcial();
        geraPrimeiroDigito();
        geraSegundoDigito();

        String cpf = "";
        String texto = "";

        /*Aqui vamos concatenar todos os valores da lista em uma string
          Por que isso? Porque a formatacao que o ArrayList gera me impossibilitaria de usar a mascara,
          pois junto com os numeros gerados ele tambem gera caracteres especias. Ex.: lista com inteiros (de 1 a 5)
          [1 , 2 , 3 , 4 , 5]
          Dessa forma o sistema geraria a excecao ParseException*/
        for(int item : listaAleatoria){
            texto += item;
        }

        //Dentro do bloco try.. catch.. tentaremos adicionar uma mascara ao nosso CPF
        try{
            MaskFormatter mf = new MaskFormatter("###.###.###-##");  
            mf.setValueContainsLiteralCharacters(false);
            cpf = mf.valueToString(texto);
        }catch(Exception ex){
            ex.printStackTrace();
        }
        System.out.println(geraCPFFinal());

        return cpf; 


    }
}
  • What is the problem presented? What is it calling? I see some problems in it.One of them is that the function is recursive. Was this the intention? It seems that this is the biggest problem.

  • It shows no error, just displays nothing on the console.

  • Help me understand how it works and how to use it correctly please.

  • It gives more details of what you’re doing. The code is disorganized, so you can’t tell what happens to it by just reading it. You have to explain.

1 answer

3


Aside from recursion, it worked:

import java.util.ArrayList;

import javax.swing.text.MaskFormatter;

class GeraCPF {
    private ArrayList<Integer> listaAleatoria = new ArrayList<Integer>();
    private ArrayList<Integer> listaNumMultiplicados = null;

    //Metodo para geracao de um numero aleatorio entre 0 e 9
    public int geraNumAleatorio(){
        //Note que foi preciso fazer um cast para int, ja que Math.random() retorna um double
        int numero = (int) (Math.random() * 10);

        return numero;
    }   

    //Metodo para geracao de parte do nosso CPF (aqui geramos apenas os 9 primeiros digitos)
    public ArrayList<Integer> geraCPFParcial(){
        for(int i = 0; i < 9; i++){
            listaAleatoria.add(geraNumAleatorio());
        }

        return listaAleatoria;
    }

    //Metodo para geracao do primeiro digito verificador (para isso nos baseamos nos 9 digitos aleatorios gerados anteriormente)
    public ArrayList<Integer> geraPrimeiroDigito(){
        listaNumMultiplicados = new ArrayList<Integer>();
        int primeiroDigito;
        int totalSomatoria = 0;
        int restoDivisao;
        int peso = 10;

        //Para cada item na lista multiplicamos seu valor pelo seu peso
        for(int item : listaAleatoria){
            listaNumMultiplicados.add(item * peso);

            peso--;
        }

        //Agora somamos todos os itens que foram multiplicados
        for(int item : listaNumMultiplicados){
            totalSomatoria += item;
        }

        restoDivisao = (totalSomatoria % 11);

        //Se o resto da divisao for menor que 2 o primeiro digito sera 0, senao subtraimos o numero 11 pelo resto da divisao
        if(restoDivisao < 2){
            primeiroDigito = 0;
        } else{
            primeiroDigito = 11 - restoDivisao;
        }

        //Apos gerar o primeiro digito o adicionamos a lista
        listaAleatoria.add(primeiroDigito);

        return listaAleatoria;
    }

    //Metodo para geracao do segundo digito verificador (para isso nos baseamos nos 9 digitos aleatorios + o primeiro digito verificador)
    public ArrayList<Integer> geraSegundoDigito(){
        listaNumMultiplicados = new ArrayList<Integer>();
        int segundoDigito;
        int totalSomatoria = 0;
        int restoDivisao;
        int peso = 11;

        //Para cada item na lista multiplicamos seu valor pelo seu peso (observe que com o aumento da lista o peso tambem aumenta)
        for(int item : listaAleatoria){
            listaNumMultiplicados.add(item * peso);

            peso--;
        }

        //Agora somamos todos os itens que foram multiplicados
        for(int item : listaNumMultiplicados){
            totalSomatoria += item;
        }

        restoDivisao = (totalSomatoria % 11);

        //Se o resto da divisao for menor que 2 o segundo digito sera 0, senao subtraimos o numero 11 pelo resto da divisao
        if(restoDivisao < 2){
            segundoDigito = 0;
        } else{
            segundoDigito = 11 - restoDivisao;
        }

        //Apos gerar o segundo digito o adicionamos a lista
        listaAleatoria.add(segundoDigito);

        return listaAleatoria;
    }

    //Agora que temos nossa lista com todos os digitos que precisamos vamos formatar os valores de acordo com a mascara do CPF
    public String geraCPFFinal() {
        //Primeiro executamos os metodos de geracao
        geraCPFParcial();
        geraPrimeiroDigito();
        geraSegundoDigito();

        String cpf = "";
        String texto = "";

        /*Aqui vamos concatenar todos os valores da lista em uma string
          Por que isso? Porque a formatacao que o ArrayList gera me impossibilitaria de usar a mascara,
          pois junto com os numeros gerados ele tambem gera caracteres especias. Ex.: lista com inteiros (de 1 a 5)
          [1 , 2 , 3 , 4 , 5]
          Dessa forma o sistema geraria a excecao ParseException*/
        for(int item : listaAleatoria){
            texto += Integer.toString(item);
        }

        //Dentro do bloco try.. catch.. tentaremos adicionar uma mascara ao nosso CPF
        try {
            MaskFormatter mf = new MaskFormatter("###.###.###-##");  
            mf.setValueContainsLiteralCharacters(false);
            cpf = mf.valueToString(texto);
        } catch (Exception ex){
            ex.printStackTrace();
        }
        return cpf; 
    }
    public static void main (String[] args) {
        System.out.println(new GeraCPF().geraCPFFinal());
    }
}

Behold working in the ideone. And in the repl it.. Also put on the Github for future reference.

But I would change a lot in this code, it has numerous problems, I have already started to improve in links above*.

  • Again, thank you so much for your help, I will study this code and try to make this feature more organized.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.